spring-aop一些知识

参考:http://blog.csdn.net/wenbingoon/article/details/8988553
代理分静态和动态2中,静态代理是在编译前手动写源码如jdk静态代理(基本没啥用)和编译期改写字节码(如Aspect工具),Aspect提供了ajc命令(可以看作javac的变种),根据aspect自己的源码文件来改写生成的.class文件。
动态代理指基于接口的动态代理和基于cglib生成子类的动态代理。


asm,cglib,spring-aop,aspectj和jdk动态代理是什么关系?
asm是一个操作.class自己码的类库,由于比较复杂在其上封装了一层cglib,aspect是eclipse的一个项目,和spring-aop等基本没有关系,是一个独立的项目,包括Advice和PointCut等规则定义以及编译期等工具。spring-aop是参考并使用的aspect的Advice和PointCut等规则定义,但是没有使用编译工具,因此spring-aop用的是jdk或cglib的动态代理(如果没定义proxy-target-class=true则spring-aop会自动判断有interface就走jdk动态代理,没有就走cglib,如果定义为true则全部走cglib)。
从spring3.2+开始,spring-core集成了cglib代码(但是看不到源码),但是spring并没有继承aspectj的代码(猜测可能是版权原因),因此如果代码中用到了@Apect,@Before及, 需要将aspectjweaver.jar包括进pom.xml。

使用jdk动态代理的时候,如果一个方法调用兄弟方法,则兄弟方法不会被代理。因为在invoke中真正干活的还是被代理对象,被代理对象的.class文件并没有被改变。而cglib代理改变了.class,会对每一个对象方法都进行拦截。

jdk代理是通过invocation handler+代理去植入切面逻辑和执行业务逻辑。
cglib是通过method interceptor+代理去植入切面逻辑和执行业务逻辑。代理执行业务逻辑是通过jdk反射方式。典型应用是spring声明式事务。


问题:service层有事务拦截和druid监控拦截,那么这2个拦截谁先谁后?

你可能感兴趣的:(spring-aop一些知识)