这次来浅谈一下注解spring AOP 的源码,在spring底层代码中,作为开启注解AOP的 @EnableAspectJAutoProxy 究竟干了些啥。
本文章记录的是博主学习aop源码的一些理解,如果有错,望指出
@EnableAspectJAutoProxy的代码历程
1. 是个啥?
它,长这样:
这里重点是 @Import(AspectJAutoProxyRegistrar.class),导入了 AspectJAutoProxyRegistrar.class。
AspectJAutoProxyRegistrar类
进入这个类中,在注释中发现这个类是用来将 AnnotationAwareAspectJAutoProxyCreator 这个类注册到 BeanDefinitionRegistry 里。
AnnotationAwareAspectJAutoProxyCreator 这个类是什么呢?这里先不说,在后面更新的文章中会详细讲解。
那么,这个类要怎么把 AnnotationAwareAspectJAutoProxyCreator 这个类注册到 BeanDefinitionRegistry 里的呢?
继续往下看,可以看到该类中重写了一个方法:
这里关注一下圈起来的代码,这个代码的意思大概是“如果需要的话就注册AspectJAnnotationAutoProxy的创造者”。点进去之后会发现方法内又调用了与该方法重名的另一个方法:
圈起来的代码的大意是“注册或升级xxx(我也不懂)”,然后传入了上面提到的 AnnotationAwareAspectJAutoProxyCreator.class,此时继续进去看看发生了什么。
@Nullable
private static BeanDefinition registerOrEscalateApcAsRequired(
Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
/** 直接看这里
这里是判断bean的定义工厂registry中有没有
AUTO_PROXY_CREATOR_BEAN_NAME ="org.springframework.aop.config.internalAutoProxyCreator"
第一次运行项目时是没有的,结果为 false
*/
if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
if (!cls.getName()