Spring AOP 面向切面编程,就是剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,也就是切面。简单来说就是与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少代码量,降低模块间的耦合度,并有利于可操作性和可维护性。
Spring AOP核心:
- 切面(aspect):类是对物体特征的抽象,切面是对横切关注点的抽象。
- 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
- 连接点(jointPoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
- 切入点(Point):对连接点进行拦截的定义。
- 通知(advice):所谓 通知指的是拦截到连接点之后要执行的代码,通知又分为前置、后置、异常、最终、环绕通知五类。
- 目标对象(Target Object):代理的目标对象。
- 织入(weave):将切面应用到目标对象并导致代理对象创建的过程。
- 引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。
AOP的两种代理方式
Spring提供了两种方式来生成代理对象:JDK Proxy和CGLIB。具体使用哪种方式AopProxyFactory根据AdvicedSupport对象的配置来决定。一般情况下,如果目标类是接口,使用JDK动态代理,否则使用CGLIB来生成代理。
JDK动态接口代理
Java动态代理主要涉及到java.lang.reflect包下的两个类:Proxy和invocationHandler .InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.Proxy利用invocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象.
CGLIB动态代理
CGLIB是一个强大的高性能高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLIB封装了asm,可以在运行期动态生成新的class,和JDK动态代理相比较,JDK创建代理只能为接口创建实例,而对于没有通过接口定义业务方法的类,则可以通过CGLIB创建动态代理。
通知类型
- Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可。
- AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returing代表目标方法的返回值
- AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,则可以通过该形参名来访问目标方法中所抛出的异常对象。
- After:在目标方法完成之后做增强,无论目标对象是否成功完成,@After可以指定一个切入点表达式
- Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
性能测试工具Jmeter
分布式事务之TX-LCN