06
2020
05

谈谈对AOP理解?

aop面向切面编程,关键在于代理模式,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。动态代理可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。


Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:


JDK代理:基于接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例,  生成目标类的代理对象。


Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);


CGLIB动态代理:如果代理类没有实现 InvocationHandler 接口(或者说是基于父子类的),那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的


Enhancer是一个非常重要的类,它允许为非接口类型创建一个JAVA代理,Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法,和JDK动态代理不一样的是不管是接口还是类它都能正常工作


b18bb7477eb8d112f4829f3befadceb1.jpg


sping的动态代理通过代理类为目标对象增加额外功能。


代理本质 = 目标对象+额外功能+代理对象的接口


开发步骤:


1,创建原始对象


2,提供额外功能(实现下面的接口)


MethodBeforeAdvice   额外功能需要运行在原始方法之前执行.

AfterReturningAdvice   额外功能需要运行在原始方法之后执行

MethodInterceptor  额外功能需要运行在原始方法之前 后执行

ThrowsAdvice  额外功能运行在原始方法抛出异常的执行

3,配置切入点


 <aop:pointcut id="pc"  expression="execution(* *(..))"/>


4,组装切入点和代理功能


<aop:advisor pointcut-ref="pc" advice-ref="代理功能的bean"/>

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。