可以看到会注册一个 AnnotationAwareAspectJAutoProxyCreator 自动代理对象,是不是很熟悉,就是在前面文章讲到的自动代理对象,那么就开启了 Spring AOP 自动代理,也就是开启了 Spring AOP 整个模块。
AopConfigUtilsorg.springframework.aop.config.AopConfigUtils,AOP 工具类
构造函数 public abstract class AopConfigUtils { /** * The bean name of the internally managed auto-proxy creator. */ public static final String AUTO_PROXY_CREATOR_BEAN_NAME = "org.springframework.aop.config.internalAutoProxyCreator"; /** * Stores the auto proxy creator classes in escalation order. */ private static final List<Class<?>> APC_PRIORITY_LIST = new ArrayList<>(3); static { // Set up the escalation list... APC_PRIORITY_LIST.add(InfrastructureAdvisorAutoProxyCreator.class); APC_PRIORITY_LIST.add(AspectJAwareAdvisorAutoProxyCreator.class); APC_PRIORITY_LIST.add(AnnotationAwareAspectJAutoProxyCreator.class); } }上面定义了 AspectJAwareAdvisorAutoProxyCreator 几种子类的优先级,排在后面优先级越高
registerAspectJAnnotationAutoProxyCreatorIfNecessary 方法 @Nullable public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry) { return registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, null); } @Nullable public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary( BeanDefinitionRegistry registry, @Nullable Object source) { // 注册 AnnotationAwareAspectJAutoProxyCreator Bean return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source); } @Nullable private static BeanDefinition registerOrEscalateApcAsRequired( Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); // <1> 如果 `org.springframework.aop.config.internalAutoProxyCreator` 已注册 if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) { // <1.1> 获取对应的 BeanDefinition 对象 BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME); // <1.2> 如果已注册的 `internalAutoProxyCreator` 和入参的 Class 不相等,说明可能是继承关系 if (!cls.getName().equals(apcDefinition.getBeanClassName())) { // <1.2.1> 获取已注册的 `internalAutoProxyCreator` 的优先级 int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName()); // <1.2.2> 获取需要注册的 `internalAutoProxyCreator` 的优先级 int requiredPriority = findPriorityForClass(cls); // InfrastructureAdvisorAutoProxyCreator < AspectJAwareAdvisorAutoProxyCreator < AnnotationAwareAspectJAutoProxyCreator // 三者都是 AbstractAutoProxyCreator 自动代理对象的子类 if (currentPriority < requiredPriority) { // <1.2.3> 如果需要注册的优先级更高,那取代已注册的 Class 对象 apcDefinition.setBeanClassName(cls.getName()); } } // <1.3> 因为已注册,则返回 `null` return null; } // <2> 没有注册,则创建一个 RootBeanDefinition 对象进行注册 RootBeanDefinition beanDefinition = new RootBeanDefinition(cls); // <3> 设置来源 beanDefinition.setSource(source); // <4> 设置为最高优先级 beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE); // <5> 设置角色为**ROLE_INFRASTRUCTURE**,表示是 Spring 框架内部的 Bean beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); // <6> 注册自动代理的 Bean,名称为 `org.springframework.aop.config.internalAutoProxyCreator` registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition); // <7> 返回刚注册的 RootBeanDefinition 对象 return beanDefinition; }可以看到会注册一个 AnnotationAwareAspectJAutoProxyCreator 自动代理 Bean,过程如下:
如果 org.springframework.aop.config.internalAutoProxyCreator 已注册
获取对应的 BeanDefinition 对象
如果已注册的 internalAutoProxyCreator 和入参的 Class 不相等,说明可能是继承关系
获取已注册的 internalAutoProxyCreator 的优先级
获取需要注册的 internalAutoProxyCreator 的优先级
如果需要注册的优先级更高,那取代已注册的 Class 对象,InfrastructureAdvisorAutoProxyCreator < AspectJAwareAdvisorAutoProxyCreator < AnnotationAwareAspectJAutoProxyCreator
否则,因为已注册,则返回 null
否则,没有注册,则创建一个 RootBeanDefinition 对象进行注册
设置来源
设置为最高优先级
设置角色为ROLE_INFRASTRUCTURE,表示是 Spring 框架内部的 Bean
注册自动代理的 Bean,名称为 org.springframework.aop.config.internalAutoProxyCreator
返回刚注册的 RootBeanDefinition 对象
整个过程很简单,如果已注册自动代理对象,则判断当前需要注册的是否优先级更高,如果更高则修改其对应的 Class 名称;如果没有注册,那么注册这个代理对象,设置优先级最高。
------------------------------------ AOP XML 配置解析过程