[转载]AOP的实现机制
转载自:http://kiral.iteye.com/blog/1198982
在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较。?
?
类别
机制
原理
优点
缺点
静态AOP
静态织入
在编译期,切面直接以字节码的形式编译到目标字节码文件中。
对系统无性能影响。
灵活性不够。
动态AOP
动态代理
在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。
相对于静态AOP更加灵活。
切入的关注点需要实现接口。对系统有一点性能影响。
动态字节码生成
在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。
没有接口也可以织入。
扩展类的实例方法为final时,则无法进行织入。
自定义类加载器
在运行期,目标加载前,将切面逻辑加到目标字节码里。
可以对绝大部分类进行织入。
代码中如果使用了其他类加载器,则这些类将不会被织入。
字节码转换
在运行期,所有类加载器加载字节码前,前进行拦截。
可以对所有类进行织入。
?
2 AOP里的公民
?
![点击查看原始大小图片 [转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378287.jpg)
织入器通过在切面中定义pointcut来搜索目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类。
3 AOP的实现机制?
? 本章节将详细介绍AOP有各种实现机制。
3.1 动态代理
? Java在JDK1.3后引入的动态代理机制,使我们可以在运行期动态的创建代理类。使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,InvocationHandler是切面,它包含了Advice和Pointcut。 ![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378288.jpg)
3.1.1 使用动态代理
? 那如何使用动态代理来实现AOP。下面的例子演示在方法执行前织入一段记录日志的代码,其中Business是代理类,LogInvocationHandler是记录日志的切面,IBusiness, IBusiness2是代理类的接口,Proxy.newProxyInstance是织入器。
清单一:动态代理的演示
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
??? 本节介绍如何使用Cglib来实现动态字节码技术。Cglib是一个强大的,高性能的Code生成类库,它可以在运行期间扩展Java类和实现Java接口,它封装了Asm,所以使用Cglib前需要引入Asm的jar。 清单七:使用CGLib实现AOP
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
Javassist是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。这比使用Cglib实现AOP更加高效,并且没太多限制,实现原理如下图:
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378291.jpg)
??? 我们使用系统类加载器启动我们自定义的类加载器,在这个类加载器里加一个类加载监听器,监听器发现目标类被加载时就织入切入逻辑,咱们再看看使用Javassist实现AOP的代码:
清单八:启动自定义的类加载器?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- ?
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378289.png)
- 大小: 17 KB
![[转载]AOP的兑现机制](http://img.reader8.net/uploadfile/jiaocheng/20140140/2700/201401271700378290.gif)
大小: 22.4 KB
大小: 13.3 KB
大小: 10.9 KB
大小: 11.6 KB
大小: 18.5 KBAop实现机制测试代码.rar (2.3 MB)下载次数: 785AOP的实现机制.pdf (794.8 KB)下载次数: 1142