码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-11 10:00:42      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:join   动态   编程思想   cglib   images   意义   div   str   接受   

前戏《浅析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的底层实现技术 -- 动态代理


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

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

标签:join   动态   编程思想   cglib   images   意义   div   str   接受   

原文地址:https://www.cnblogs.com/vince-zww/p/11504175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!