0%

Spring AOP原理

什么是AOP

AOP(Aspect-Oriented Programming,面向方面编程)是对OOP(Object-Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承和多态等概念来建立对象层次结构,当需要为分散的对象引入公共行为时,OOP就显得无能为力。OOP适合定义从上到下的关系,但不适合定义从左到右的关系。例如日志功能的代码往往水平地分散在所有对象层次中,这种水平分布的代码称为横切(cross-cutting)代码,在OOP设计中会导致大量的代码重复,不利于代码复用和系统维护。

AOP采用“横切”技术,将那些影响了多个类的公共行为封装到一个可重用的模块(Aspect即方面)中。如果对象是一个空心的圆柱体,其中封装的是对象的属性和行为,那么AOP就像一把利刃,将这些空心圆柱体剖开,剖开的切面就是Aspect切面。

AOP把软件分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点经常发生在核心关注点的多处,各处基本相似。比如权限认证、日志、事务处理。AOP的核心思想就是将业务逻辑同对其提供支持的通用服务进行分离。

实现AOP的技术分为两类:一是采用动态代理技术,利用截取消息的方式,对消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建Aspect,从而使编译器可以在编译期间织入Aspect代码。

AOP使用场景

  1. Authentication权限
  2. Caching缓存
  3. Context passing内容传递
  4. Error handling错误处理
  5. Lazy loading懒加载
  6. Debugging调试
  7. logging,tracing,profiling and monitoring记录,追踪,优化校准
  8. Performanceoptimization性能优化
  9. Persistence持久化
  10. Resource polling资源池
  11. Synchronization同步
  12. Transaction事务

AOP中的概念

切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义。在Spring AOP 底层来, Aspect 的概念使用 Advisor 代替, 一个 Advisor 只有一个 Pointcut 和 相应的 Advice。
连接点(Joinpoint):程序执行中明确的点,如方法的调用,或者异常的抛出。
增强处理(Advice):AOP框架在特定的切入点执行增强处理,有Before、After、Around、Throws、Introduction等类型
切入点(Pointcut):可以插入增强处理的连接点,当某个连接点满足指定要求时,该切入点被添加增强处理,该连接点也就变成了切入点
引入(Introduction):将方法或字段添加到被处理的类中,Spring允许将新的接口引入到任何被处理的对象中,例如,可以使用一个引入使任何对象实现IsModified接口,以简化缓存
目标对象(Target Object):包含连接点的对象,也被称为增强的对象,如果AOP采用动态AOP实现,那么该对象就是一个被代理的对象
AOP代理(AOP Proxy):AOP框架创建的对象,代理就是对目标对象的加强。Spring AOP中使用JDK动态代理为实现接口创建代理,cglib为没有实现接口的目标创建代理。
织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种方式:编译时增强(AspectJ)和运行时增强(如Spring AOP)

参考资料

  1. AOP实现原理及源码分析
  2. Spring 实现原理
    1. 关于 Spring AOP (AspectJ) 你该知晓的一切