SpringAOP源码解读

本文深入探讨Spring AOP的实现原理,重点分析AnnotationAwareAspectJAutoProxyCreator的作用及其在容器初始化过程中的工作流程,包括BeanPostProcessor的注册、Bean的创建和初始化,以及如何通过拦截器链实现切面通知。
摘要由CSDN通过智能技术生成

AOP原理:【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么?】

@EnableAspectJAutoProxy(@Import(AspectJAutoProxyRegistrar.class实现了ImportBeanDefinitionRegistrar(这个类就可以帮助我们手动注册类)))下面就是AspectJAutoProxyRegistrar具体内容:然后我们可以具体通过debug来研究源码
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);
		}
	}

首先第一步:来判断是否需要注册此组件:

AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

点进来:

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

点进来:注册或者升级

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

点进去:携带参数AnnotationAwareAspectJAutoProxyCreator==internalAutoProxyCreator???

判断是否存在internalAutoProxyCreator,显然可知我们第一次创建并没有,然后调用方法创建

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;
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);这一步:内部又把AnnotationAwareAspectJAutoProxyCreator付给internalAutoProxyCreator(AUTO_PROXY_CREATOR_BEAN_NAME代表就是internalAutoProxyCreator)

1:总结来说:给容器中注册一个AnnotationAwareAspectJAutoProxyCreator;

第二步:我们就开始研究AnnotationAwareAspectJAutoProxyCreator的作用和什么时候工作;

首先继承关系:

 *         AnnotationAwareAspectJAutoProxyCreator
 *             ->extends AspectJAwareAdvisorAutoProxyCreator
 *                 ->extends AbstractAdvisorAutoProxyCreator
 *                     ->extends AbstractAutoProxyCreator
 *                         implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
 *                         关注后置处理器(SmartInstantiationAwareBeanPostProcessor在bean初始化完成前后做事情)、自动装配(BeanFactoryAware:BeanFactory【可以将BeanFactory注册到当前类里面使用】)

下面是各个类中我们执行的主要的方法

 * AbstractAutoProxyCreat

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值