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