AOP原理——1. @EnableAspectJAutoProxy

@EnableAspectJAutoProxy

可以看出这个注解的主要作用就是导入AspectJAutoProxyRegistrar

@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
	// ...
}

AspectJAutoProxyRegistrar

继承 ImportBeanDefinitionRegistrar接口,所以这个类的作用就是把相关Bean注册到Spring中。

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// 在这注册,跟进去
		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
		// 处理 EnableAspectJAutoProxy 注解的属性。
		AnnotationAttributes enableAspectJAutoProxy =AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
		if (enableAspectJAutoProxy != null) {
			if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
				AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
			}
			if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
				AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
			}
		}
	}
}

AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary

	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry) {
		return registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, null);
	}

registerAspectJAnnotationAutoProxyCreatorIfNecessary

	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, @Nullable Object source) {
		// 传入的是这个类:AnnotationAwareAspectJAutoProxyCreator
		return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}

registerOrEscalateApcAsRequired

	public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
			"org.springframework.aop.config.internalAutoProxyCreator";
			
	private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {
		// ...
		// 注册传入的 AnnotationAwareAspectJAutoProxyCreator 类
		RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
		// ...
		// IOC 中 AnnotationAwareAspectJAutoProxyCreator Bean 的 id 是 AUTO_PROXY_CREATOR_BEAN_NAME
		registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
		return beanDefinition;
	}

费这么大劲就是为了把 AnnotationAwareAspectJAutoProxyCreator注入IOC。
所以要想知道AOP的原理,就要弄清楚AnnotationAwareAspectJAutoProxyCreator的作用。

AnnotationAwareAspectJAutoProxyCreator

可以看出这个类继承了BeanPostProcessor,也就是说它起作用的关键在于它是一个BeanPostProcessor
也就是说,AOP是通过InstantiationAwareBeanPostProcessorBeanPostProcessor来创建动态代理对象的。核心流程在其父类AbstractAutoProxyCreator中。
AnnotationAwareAspectJAutoProxyCreator


相关文章:
AOP原理——2. AbstractAutoProxyCreator 创建动态代理对象

posted @ 2020-12-03 10:31  qianbuhan  阅读(316)  评论(0)    收藏  举报