浅析AOP(二)——简单应用

前戏《浅析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()还可以对参数进行修改。

测试代码:

dao:


 
测试类:

 

改变了输入的参数。

在实际应用环境中,切面一般是单例的。

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的底层实现技术 -- 动态代理


本人才疏学浅,以上纯属个人理解,如有不对,还望批评指正。

posted @ 2019-09-11 08:12  vince_z  阅读(187)  评论(0编辑  收藏  举报