0
点赞
收藏
分享

微信扫一扫

spring核心源码分析第二十六篇 Aop核心源码分析一开启aop之EnableAspectJAutoProxy


文章目录

  • ​​aop-beandefinition加载​​
  • ​​总结​​

aop-beandefinition加载

  • 1 通过注解@EnableAspectJAutoProxy导入AspectJAutoProxyRegistrar 完成beandefinition注册
  • 2 AspectJAutoProxyRegistrar继承ImportBeanDefinitionRegistrar完成从多个aop工具选择一个aop
  • 3 通过AopConfigUtils工具类完成注册
  • 4 构建beandefinition并注册beanfactory

通过启动类配置AspectJAutoProxyRegistrar 完成beandefinition注册
@Import(AspectJAutoProxyRegistrar)
public @interface EnableAspectJAutoProxy {

}

AspectJAutoProxyRegistrar继承ImportBeanDefinitionRegistrar
完成从多个aop工具选择一个aop
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {

/**
* Register, escalate, and configure the AspectJ auto proxy creator based on the value
* of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing
* {@code @Configuration} class.
*/
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

实现aop beandefinition注册核心
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy != null) {
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}

}



public abstract class AopConfigUtils {
指定aop的实现类AnnotationAwareAspectJAutoProxyCreator
@Nullable
public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
BeanDefinitionRegistry registry, @Nullable Object source) {
return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
}

private static BeanDefinition registerOrEscalateApcAsRequired(
Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {

Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
此时容器中不包含该bpp 的beanname if分支不会走到
if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
int requiredPriority = findPriorityForClass(cls);
if (currentPriority < requiredPriority) {
apcDefinition.setBeanClassName(cls.getName());
}
}
return null;
}
完成aop BPP的beandefinition创建和注册
RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
beanDefinition.setSource(source);
beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
return beanDefinition;
}
}

总结

  • 通过enable注解,完成了aop工具类的beandefinition注册,后续ApplicationContext会完成该BPP的实例化


举报

相关推荐

0 条评论