前戏《浅析AOP(一)——基本概念》已经准备好了前置认识。
本篇再剖析一下AOP。
SpringAOP的底层技术
JDK动态代理和CGLIB动态代理
两者都是在运行时期织入。
JDK动态代理是基于聚合接口来的,因为java是单继承,代理对象已经继承了Proxy,不能再多继承了,所以只能实现目标对象的接口。在Proxy这个类当中首先实例化一个对象ProxyClassFactory,然后在get方法中调用了apply方法,完成对代理类的创建。
CGLIB动态代理是基于继承,CGLIB采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并在拦截方法相应地方织入横切逻辑。
Spring AOP的应用
在环绕通知中:
ProceedingJoinPoint是JoinPoint的增强类,Proceedingjoinpoint 继承JoinPoint,扩展了JoinPoint。
JoinPoint中没有invoke方法,无法反射;所以需要ProceedingJoinPoint类中的proceed()方法,并且proceed()还可以对参数进行修改。
测试代码:
改变了输入的参数。
在实际应用环境中,切面一般是单例的。
AspectJ support
AspectJ support 非常重要的一点!
这里引出一个问题:
AOP 和SpringAOP和AspectJ是什么关系?
AOP是一种编程思想,而SpringAOP是AOP的一种实现!能够实现AOP的还有AspectJ和JBoss AOP。
为什么要SpringAOP要用到AspectJ?
在Spring2.0有一套自己的AOP语法,但是非常复杂,外界不接受。
所以Spring后续借助了AspectJ的语法,仅仅借助了AspectJ的语法,底层还是Spring的底层技术。
总结:
Spring AOP在底层就是利用JDK动态代理或CGLib动态代理技术为目标Bean织入横切逻辑。
CGLIB是通过继承来操作子类的字节码生成代理类,JDK是通过接口,然后利用java反射完成对类的动态创建,严格意义上来说CGLIB的效率高于JDK的反射,但是这种效率取决于代码功力,其实可以忽略不计,毕竟JDK是JVM的亲儿子。
AOP深入内容非常多,博主暂时只能浅析到这里,后续继续进行学习记录总结。
参考资料:
Spring学习之Spring AOP的底层实现技术 -- 动态代理
本人才疏学浅,以上纯属个人理解,如有不对,还望批评指正。