AOP原理——@EnableAspectJAutoProxy

@EnableAspectJAutoProxy注解源码解析

在使用@EnableAspectJAutoProxy注解时,同时也使用@Import注解给容器中导入了AspectJAutoProxyRegistrar组件

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

AspectJAutoProxyRegistrar组件实现了ImportBeanDefinitionRegistrar接口,可以自定义给容器中注册组件

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) {

		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

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

}

AspectJAutoProxyRegistrar类里面registerBeanDefinitions方法首先调用AopConfigUtils类的registerAspectJAnnotationAutoProxyCreatorIfNecessary来注册registry,即如果需要的话就注册一个AspectJAnnotationAutoProxyCreator组件。

AopConfigUtils类的registerAspectJAnnotationAutoProxyCreatorIfNecessary方法中又继续调用重载方法registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, null)

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

重载方法registerAspectJAnnotationAutoProxyCreatorIfNecessary方法又进一步调用registerOrEscalateApcAsRequired方法,并且在registerOrEscalateApcAsRequired()方法中,传入了AnnotationAwareAspectJAutoProxyCreator.class对象

	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
		return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}

在这里插入图片描述
registerOrEscalateApcAsRequired()方法中会做一个判断,即首先判断registry(也就是IOC容器)是否包含名称为org.springframework.aop.config.internalAutoProxyCreator的bean。如果包含,将名称为org.springframework.aop.config.internalAutoProxyCreator的bean从容器中取出,并且判断cls对象的name值和apcDefinitionbeanClassName值是否相等,若不相等,则获取apcDefinitioncls它俩的优先级,如果apcDefinition的优先级小于cls的优先级,那么将apcDefinitionbeanClassName设置为clsname值。如果不包含,会使用RootBeanDefinition来创建一个bean的定义信息(即beanDefinition),并且将org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreatorClass对象作为参数传递进来。最终在AopConfigUtils类的registerOrEscalateApcAsRequired()方法中,会通过registry调用registerBeanDefinition()方法注册组件,注册的组件的类型是org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator,组件的名字是org.springframework.aop.config.internalAutoProxyCreator

	private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		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;
		}
		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;
	}

之后,通过AnnotationConfigUtils类的attributesFor()方法来获取@EnableAspectJAutoProxy注解的信息。接着,就是判断proxyTargetClass属性的值是否为true,若为true则调用AopConfigUtils类的forceAutoProxyCreatorToUseClassProxying()方法;继续判断exposeProxy属性的值是否为true,若为true则调用AopConfigUtils类的forceAutoProxyCreatorToExposeProxy()方法

	@Override
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

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

简而言之,Spring的配置类上添加@EnableAspectJAutoProxy注解之后,会向IOC容器中注册AnnotationAwareAspectJAutoProxyCreator组件,即注解装配模式的AspectJ切面自动代理创建器。

AnnotationAwareAspectJAutoProxyCreator类的结构图:
在这里插入图片描述
AnnotationAwareAspectJAutoProxyCreator类实现了AwareBeanPostProcessor接口,这两个接口都和bean的初始化有关,由此可以推测此AnnotationAwareAspectJAutoProxyCreator类的主要处理方法都来自于这两个接口中的实现方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值