AOP入门
- 概念:
关注点:可以认为是所关注的任何东西;
关注点分离:将问题细化为单独部分,即可以理解为不可再分割的组件,
横切关注点:会在多个模块中出现,使用现有的编程方法,横切关注点会横越多个模块,结果是使系统难以设计、理解、实现和演进,如日志组件横切于支付组件。
织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中从而完成需要的功能,因此需要织入,织入可能在编译期、加载期、运行期等进行。
- AOP是什么(Aspect Oriented Programming)
AOP是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程 (OOP)。
AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
- AOP能干什么,也是AOP带来的好处
1:降低模块的耦合度
2:使系统容易扩展
3:设计决定的迟绑定:使用AOP,设计师可以推迟为将来的需求作决定,因为它可以把这种需求作为独立的方面很容易的实现。
4:更好的代码复用性
- AOP基本概念
连接点(Joinpoint ):在哪里做
表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为“在哪里做” ;
切入点(Pointcut ):在哪里做的集合
选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式, Spring默认使用AspectJ语法,在AOP中表示为 “在哪里做的集合” ;
增强(Advice )或称为增强: 做什么
在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置增强(before advice )、后置增强 (after advice)、环绕增强 (around advice ),在Spring中通过代理模式实现AOP ,并通过拦截器模式以环绕连接点的拦截器链织入增强;在AOP中表示为 “做什么” ;
方面/切面(Aspect ):在哪里做和做什么集合
横切关注点的模块化,比如上边提到的日志组件。可以认为是增强、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为 “在哪里做和做什么集合” ;
目标对象(Target Object ):对谁做
需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被增强的对象,从而也可称为“被增强对象”; 由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为 “对谁做” ;
AOP代理(AOP Proxy ):
AOP框架使用代理模式创建的对象,从而实现在连接点处插入增强(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。
织入(Weaving ):
织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
引入(inter-type declaration ):做什么 (新增什么)
也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为 “做什么 (新增什么)” ;
- AOP的Advice类型
前置增强(Before advice ):
在某连接点之前执行的增强,但这个增强不能阻止连接点前的执行(除非它抛出一个异常)。
后置返回增强(After returning advice ):
在某连接点正常完成后执行的增强:例如,一个方法没有抛出任何异常,正常返回。
后置异常增强(After throwing advice ):
在方法抛出异常退出时执行的增强。
后置最终增强(After (finally) advice ):
当某连接点退出的时候执行的增强(不论是正常返回还是异常退出)。
环绕增强 (Around Advice ):
包围一个连接点的增强,如方法调用。这是最强大的一种增强类型。 环绕增强可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
- AOP包括三个清晰的开发步骤:
1 :功能横切 :找出横切关注点。
2 :实现分离 :各自独立的实现这些横切关注点所需要完成的功能。
3 :功能回贴 :在这一步里,方面集成器通过创建一个模块单元—— 方面来指定重组的规则。重组过程——也叫织入或结合