文档章节

AOP初探

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 570
阅读 1075
收藏 39
想说写一个系列,又不敢说写一个系列,害怕只有开头,却没有结尾。但不管怎么样,这篇还是要写下来,不然,就连开头都没有了。 这篇打算将两种实现AOP的技术的hello world写一下。 我们知道,Java实现AOP,一般采用两种技术:
  1. 使用JDK的动态代理,在代理类中拦截方法的调用,然后做些手脚
  2. 使用类似cglib之类的工具,将AOP的代码在编译期“织入”进去,就是修改字节码。(更深的我也不知道了……)
一、先说使用动态代理的。
  1. Java限制被代理的的类必须实现一个接口。(因为代理类也去实现这个接口,而方法的调用是通过实现接口来实现多态的。)
    public interface TagetService {
        void doSomething();
    }
  2. 再是我们要代理的目标类,即要用aop拦截的方法。
    public class TagetServiceImpl implements TagetService {
    
        /**
         * 需要被拦截的方法
         */
        @Override
        public void doSomething() {
            System.out.println("doing something.");
        }
    }
  3. 然后我们就要编写我们自己的aop逻辑了。实现InvocationHandler接口,在invoke方法中写自己的逻辑代码。
    public class TargetServiceInvocationHandler implements InvocationHandler {
        /**
         * 代理的目标对象
         */
        private Object target;
    
        public TargetServiceInvocationHandler(Object target) {
            this.target = target;
        }
    
        /**
         * 拦截方法调用
         *
         * @param proxy  代理
         * @param method 方法
         * @param args   参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before do something.");
            Object result = method.invoke(target, args);
            System.out.println("after do something.");
            return result;
        }
    }
  4. 万事具备,组装起来,测试一下,(Spring AOP是不是帮我们优雅的组装了一下下?下一篇就研究一下他)
    public class Test {
    
        public static void main(String[] args) throws IllegalAccessException, InstantiationException {
            // service 实例
            TagetService instance = TagetServiceImpl.class.newInstance();
            // service 代理的实例
            TagetService tagetServiceProxy = (TagetService) Proxy.newProxyInstance(instance.getClass().getClassLoader(),
                    instance.getClass().getInterfaces(),
                    new TargetServiceInvocationHandler(instance));
            // 用代理的实例调用方法, 即会被handler拦截
            tagetServiceProxy.doSomething();
        }
    }
二、再来cglib的
  1. 这回被拦截的类不需要实现接口了
    public class TargetService {
        public void doSomething() {
            System.out.println("do something.");
        }
    }
  2. 通过实现cglig的MethodInterceptor接口,在intercept方法中实现我们的aop的逻辑
    public class TargetServiceInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("before do something.");
            Object result = proxy.invokeSuper(obj, args);
            System.out.println("after do something.");
            return result;
        }
    }
  3. 组装起来测试一下下
    public class Test {
        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(TargetService.class);
            enhancer.setCallback(new TargetServiceInterceptor());
            TargetService targetService = (TargetService) enhancer.create();
            targetService.doSomething();
        }
    }
     

© 著作权归作者所有

共有 人打赏支持
laichendong
粉丝 8
博文 85
码字总数 71483
作品 0
朝阳
程序员
加载中

评论(5)

黄勇
黄勇

引用来自“hww”的评论

引用来自“黄勇”的评论

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338

勇哥写的Java那点事系列博客不错
多谢!博主这篇言简意赅,抓住了 AOP 精髓,期待后续更优秀的博文!
已销号
已销号

引用来自“黄勇”的评论

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338

勇哥写的Java那点事系列博客不错
黄勇
黄勇

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338
laichendong
laichendong

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
never_say
never_say
有“深”探吗?
极速开发,快就是这么任性,你不知道的Jfinal2.0新特性

Jfinal2.0新特性初探 Jfinal2.0发布了,我认为这个是里程碑式的发布,新加了不少好功能,这个博文主要是写个那些不想看文档,又想知道Jfinal2.0到底有什么新变动的同学们的,希望你们看完以后...

天蓬小猪
2015/06/19
0
10
C#进阶系列——DDD领域驱动设计初探(一):聚合

原文:C#进阶系列——DDD领域驱动设计初探(一):聚合 前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的。今天看到一篇博文里面写道:越是忙人越有时间写博客。呵呵,似乎有点...

杰克.陈
2017/12/19
0
0
[转] Java Instrument 初探

java在1.5引入java.lang.instrument,你可以由此实现一个java agent,通过此agent来修改类的字节码即改变一个类。本文中,会通过java instrument 实现一个简单的profiler。当然instrument并不...

小编辑
2011/01/05
2.6K
1
AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

1、我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难。当我...

iphoenix
2016/09/06
48
0
初探设计:Java接口和类

今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。 一、接口和抽象类 类,即“物以类聚”中的类,物则为一个...

泥沙砖瓦浆木匠
2015/12/05
2K
20

没有更多内容

加载失败,请刷新页面

加载更多

下一页

又一个centos文件顺序导致的问题

背景 新的centos似乎对于文件顺序做了特别的优化 和文件顺序出现的问题确实多了不少 centos7导致的spring循环依赖【实际上和这个问题不一样 不过由此衍生出的问题】 某应用放在新的系统开始报...

Mr_Qi
12分钟前
0
0
阿里云国际版香港CN2测评 月付9美元/30M带宽/1T流量

市面上很多家香港VPS服务商,一直都说阿里云国际版香港CN2线路好,延迟低,速度快,价格便宜流量还多,那么这个香港线路到底怎么样呢?本文从性能、延时、路由、速度方面来全方面测评一下阿里...

flyzy2005
55分钟前
0
0
撤销git commit --amend

it commit -amend之后想撤销 git reset HEAD@{1}

xiaomge
今天
0
0
有意思的TimeUnit

java.util.concurrent.TimeUnit 这个类,相信童鞋们都不陌生。它是一个enum: public enum TimeUnit 好吧,我一直把它当做一个枚举类来用。偶然看到还有别的用法,大吃一斤,原来 TimeUnit 并...

polly
今天
10
0
生成pyc

Python生成pyc文件 pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改...

Mr_Tea伯奕
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部