二、Spring——AoP

AOP概述

  • AOP是OOP的有益补充,他为程序开发提供了一个崭新的思考角度,可以将重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才能真正解决复杂性代码问题。

  • Spring采用JDK动态代理和CGLib动态代理的技术在运行期间植入增强,所以我们不需要装备特殊的编译器或者类装载器就可以使用AOP的功能。要使用JDK动态代理,目标类必须实现接口,而CGLib不对目标类做任何限制,他通过动态生成目标子类的方式提供代理。JDK在创建代理对象时性能高于CGLib,而生成代理对象的运行性能却比CHLIb的低,入股是singleton的代理,我们推荐使用CGLib动态代理。

  • Spring只能在方法级别上植入增强,Spring提供了4中类型的方法增强,分别是前置增强、后置增强、环绕增强和异常抛出增强,此外还有一种特殊的引介增强,引介增强是类级别的,他为目标类织入新的接口实现。从广义上说,增强其实就是一种最简单的切面,他既包括横切代码也包括切点信息,只不过他的切点只是简单的方法相对位置的信息。所以增强一般都需要和切点联合才可以表示一个更具使用性的切面。

  • 在Spring中,普通的切点通过目标类名和方法名描述切点的信息。流程切点是比较特殊的切点,他通过方法调用堆栈的运行环境信息来决定连接点。有时,我们需要通过切点的交叉或合并描述一个最终的切点,这时,可以使用ComposablePointcut的复合切点。

  • 切面是增强和切点的联合体,我们可以很方便地通过Spring提供的ProxyBeanFactory将切面织入到不同的目标类中。当然,为每一个目标类手工配置一个切面是比较烦琐的,

  • Spring利用BeanPostProcessor可干涉Bean生命周期的机制,提供了一些可以自动创建代理,织入切面的自动代理创建器,其中DefaultAdvisorAutoProxyCreator是功能强大的自动代理创建器,他可以将容器中所有Advisor自动织入到目标Bean中。

  • Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前、方法后、方法的两端等)。
    此外,Spring通过Advisor(切面)将Pointcut和Advice两者组装起来。有了Advisor的信息,Spring就可以利用JDK或CGLib的动态代理技术采用统一的方式为目标Bean
    创建织入切面的代理对象了。

  • 使用@AspectJ定义切面比基于接口定义的切面更加直观、更加简洁,成为Spring推荐的切面定义方式。切点表达式语法和切点函数是@AspectJ的重心。

  • 如果项目因某种原因无法使用JDK5.0,则可以采用基于Schema配置的方式继续使用AspectJ的切点表达式和增强定义,基于Schema的配置采用<aop:aspect>描述@Aspect类所描述的相同信息,只是换一种方法而已。此外,还可以通过<aop:advisor>复用旧系统已有的Advice并配合使用AspectJ的切点表达式。





原文地址:https://www.cnblogs.com/jeffen/p/6143831.html