浅析AOP——简单应用

Posted vince-zww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析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的底层实现技术 -- 动态代理


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

以上是关于浅析AOP——简单应用的主要内容,如果未能解决你的问题,请参考以下文章

spring aop简单应用

spring AOP概述和简单应用

Spring AOP原理及简单应用

Unity容器的简单AOP与DI的应用Demo

浅析CQRS的应用部署

对于Spring IOC 和 AOP 简单理解