一、概述
- SpringAOP设计的主要目的是将多个方法中的公用逻辑抽离出来,封装在一个Interctor拦截器中,然后使用该拦截器对这些方法的调用Invocation进行拦截,从而将这些公用逻辑添加回去,完成一次完整的方法调用。从而实现公用逻辑的复用,避免同一个公用功能的代码重复定义、实现,造成代码冗余。
- 从应用程序编码到应用程序执行的完整过程来看:
- 首先在应用代码的方法中定义业务逻辑,然后在xml文件中使用AOP相关的标签描述这个方法或者在这个方法中添加AOP相关的注解,此时应用程序编码层面的工作已经完成了;
- 然后在运行应用程序,执行这个方法之前,首先需要加载这个方法所在的类,对于普通方法,直接调用对应方法即可;而对于使用了SpringAOP功能的方法,则需要结合xml文件或者注解来在运行时动态生成这个类的代理类,这个代理类集成了拦截器提供的公用逻辑和应用代码中方法定义的业务逻辑。然后实际调用和执行的是这个代理类的方法:一般为先执行拦截器的方法,然后执行应用方法定义的业务逻辑,最后进行执行拦截器的方法,即在业务逻辑方法执行前后可以定义执行拦截器的方法,这样就可以将抽离的公用逻辑添加回去。这样在方法执行层面,跟在应用方法中实现全部逻辑,即公用逻辑和业务逻辑,达到一样的效果。
- Spring的AOP在接口设计层面参照了Aspectj框架的概念,但是不依赖与Aspectj框架的实现。以下具体分析基础接口设计。
二、辅助功能定义
1. Advice:辅助功能定义
AfterAdvice:目标执行后来执行的辅助功能
- AfterReturningAdvice:方法产生返回值后执行。
BeforeAdvice:目标执行前来执行的辅助功能
- MethodBeforeAdvice:目标方法执行前执行。
三、辅助功能的目标方法
定义和配置,如通过正则表达式配置,需要该辅助功能的类和方法,即这些方法执行时,在方法执行前后,执行这些辅助功能。
1. PointCut:配置方式定义需要该辅助功能的目标类
- 通过配置正则表达式来匹配查找需要该辅助功能的目标类。
- 给定类和方法,看该方法是否需要该辅助功能。
四、辅助功能和目标方法的融合
1. Advisor
- 包含辅助功能Adive的引用和该辅助功能的目标,如基于PointCut定义的辅助目标,将辅助功能Advice添加到辅助目标中。
(1) PointcutAdvisor
- 继承于Advisor,包含辅助功能的目标PointCut的引用,即基于PointCut配置需要该辅助功能的类和方法,其中PointCut通常可以使用正则表达式来定义需要匹配的目标类,如在哪个包下面的全部类,或者类名以某些字符开头或结尾,包含哪些字符等来获取目标类。
五、拦截目标方法调用并织入辅助功能
主要通过拦截目标方法执行来织入辅助功能。
- 目标方法执行拦截器。
六、目标方法调用
1. MethodInvocation
- 通过代理对象来包装目标类对象,并通过代理方法来执行目标方法。
七、通过为目标对象添加额外接口的方式添加辅助功能
IntroductionInfo
- 定义提供辅助功能的接口集合。
IntroductionAdvisor
- 将IntroductionInfo包含的接口集合添加到目标类中,即目标类额外实现该接口集合的接口。之后可以直接通过目标类对象访问这些接口的方法。
DynamicIntroductionAdvice
- 判断给定的接口是否是IntroductionInfo提供的,即是否在IntroductionInfo定义的接口集合中。
IntroductionAwareMethodMatcher
- 判断目标类的给定方法是否为IntroductionInfo中的接口集合中的某个接口中定义的方法。
八、Spring AOP和IOC的关系
- AOP依赖于IOC来实现,在AOP中,使用一个代理类来包装目标类,在代理类中拦截目标类的方法执行并织入辅助功能。在Spring容器启动时,创建代理类bean替代目标类注册到IOC中,从而在应用代码中注入的目标类实例其实是目标类对应的代理类的实例,即使用AOP处理目标类生成的代理类。