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是通过InstantiationAwareBeanPostProcessor和BeanPostProcessor来创建动态代理对象的。核心流程在其父类AbstractAutoProxyCreator中。


浙公网安备 33010602011771号