前言
上文介绍了 AOP 的基本概念,本文开始进入 AOP 的源码解析,本文仍以 AspectJ 来进行介绍,首先是 AOP 注解的解析。
正文
当使用 <aop:aspectj-autoproxy /> 注解开启 AOP 功能时。
Spring会从“META-INF/spring.handlers” 配置文件中拿到该注解对应的 NamespaceHandlerSupport:AopNamespaceHandler
在 AopNamespaceHandler 的 init 方法会给该注解注册对应的解析器,aspectj-autoproxy 对应的解析器是:AspectJAutoProxyBeanDefinitionParser。
@Override
我们知道,当解析到 <aop:aspectj-autoproxy /> 注解时,会调用 AspectJAutoProxyBeanDefinitionParser 的 parse方法。
关于自定义注解的解析内容之前 IoC 的文章介绍过了,如果不了解的可以参考:Spring IoC:parseCustomElement 详解
AspectJAutoProxyBeanDefinitionParser#parse
@Override
1.注册 AspectJAnnotationAutoProxyCreator,见代码块1。
代码块1:AopNamespaceUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary
public
1.注册 AspectJAnnotationAutoProxyCreator,见代码块2。
2.对于 proxy-target-class 以及 expose-proxy 属性的处理,见代码块3。
代码块2:AopConfigUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary
public
org.springframework.aop.config.internalAutoProxyCreator 是内部管理的自动代理创建者的 bean 名称,可能对应的 beanClassName 有三种,对应的注解如下:
- InfrastructureAdvisorAutoProxyCreator:<tx:annotation-driven />
- AspectJAwareAdvisorAutoProxyCreator:<aop:config />
- AnnotationAwareAspectJAutoProxyCreator:<aop:aspectj-autoproxy />
当同时存在多个注解时,会使用优先级最高的 beanClassName 来作为 org.springframework.aop.config.internalAutoProxyCreator 的 beanClassName。本系列文章暂不考虑同时存在其他注解的情况,所以在这边会注册的 beanClassName 为:AnnotationAwareAspectJAutoProxyCreator。
代码块3:useClassProxyingIfNecessary
private
总结
本文的内容比较简单,最重要的内容就是注册了内部管理的自动代理创建者的 bean:AnnotationAwareAspectJAutoProxyCreator,AOP 的大部分重要内容都在这个bean 里,之后会一一介绍。
推荐阅读
程序员囧辉:4 年 Java 经验面试总结、心得体会zhuanlan.zhihu.comhttp://weixin.qq.com/r/oT_EnKXEJ-hYreH-92qz (二维码自动识别)