Spring AOP_jdk

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

Spring AOP_jdk_02