Spring AOP

1.AOP术语
  • 连接点(Joinpoint)
程序执行的某个特定位置,如类开始初始化前,类初始化后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”。
  • 切点(Pointcut)(org.springframework.aop_Pointcut)
每个程序都有多个连接点,AOP通过“切点”定位特定的连接点,数据库中,连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点 org.springframework.aop.Pointcut接口描述
matches(class clazz) 其参数代表一个被检测类,该方法判别被检测的类是否匹配过滤条件
is Runtime()返回false表示的是静态方法匹配器(仅对方法签名,包括方法名和入参类型及顺序,进行匹配,仅匹配一次),返回true表示的是动态方法匹配器(每次调用方法的入参都可能不一样,所以每次调用方法都必须判断,因此,动态匹配对性能影响很大,一般情况下,不建议使用)
 
  • 增强(Advice)
增强是织入到目标类连接点上的一段程序代码。增强除了用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。Spring 所提供的增强接口都是带方位名的:BeforeAdvice,AfterRetunning ThrowAdvice
五种类型:
前置增强:org.springframework.aop.Beforeadvice,代表前置增强,因为Spring只支持方法级的增强,所以MethodBeforeAdvice是目前可用的前置增强,表示在方法执行之前实施增强,而BeforeAdvice是为了将来扩展版本需要而定义的
后置增强:org.springframework.aop.AfterReturningAdvice代表后增强,表示在目标方法执行之后实施增强
环绕增强:org.aopalliance.intercept.MethodInterceptor代表环绕增强,表示在目标方法执行前后实施增强
异常抛出增强:org.springframework.aop.ThrowsAdvice代表抛出异常增强,表示在目标方法抛出异常后实施增强
引介增强:org.springframework.aop.IntruductionInterceptor代表引介增强,表示在目标方法类中添加一些新的方法和属性
org.springframework.aop.support.DelegatingIntroductionInterceptor(Spring扩展)
在配置时首先必须指定引介增强所实现的接口,其次,由于智能通过为目标类创建子类的方式生成引介增强的代理,所以必须将ProxyTargetClass设置为true。如果我们没有对ControllablePerformanceMonitor进行线程安全的特殊处理,就必须将singleton属性设置为true让ProxyFactoryBean产生Prototype作用域类型的代理,这样就会产生一个严重的性能问题,由于CGLib动态创建代理的性能很低,二每次通过get Bean()从容器中获取作用域类型为prototype的Bean时都将返回一个新的代理实例,所以这种性能的影响时非常巨大的!这也是我们为什么要在代码中通过ThreadLocal对ControllablePerformanceMonitor的开关状态进行线程安全化处理的原因,通过香橙安全化处理之后,我们就可以使用默认的singletonBean作用域,这样创建代理的动作仅发生一次
  • 目标对象(Target)
增强逻辑的织入目标类
  • 引介(Introduction)
 
一种特殊的增强,为类添加一些属性和方法
 
  • 织入(Weaving)
将增强添加到目标类具体连接点上的过程
1)编译期织入,这要求使用特殊的编译器
2)类装载期织入,这要求使用特殊的类装载器
3)动态代理织入,在运行期为目标类添加增强生成子类的方式
Spring使用动态代理织入,而AspectJ采用编译器织入和类装载期织入
  • 代理(Proxy)
一个类被AOP织入增强后,就产出了一个结果类,他是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类及可能是和原类具相同接口的类,也有就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类
  • 切面(Aspect)

posted @ 2017-12-05 18:49  菜鸟宝宝  阅读(222)  评论(0编辑  收藏  举报