死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置 (2)

可以看到会注册一个 AnnotationAwareAspectJAutoProxyCreator 自动代理对象,是不是很熟悉,就是在前面文章讲到的自动代理对象,那么就开启了 Spring AOP 自动代理,也就是开启了 Spring AOP 整个模块。

AopConfigUtils

org.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 配置解析过程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygssw.html