一、Spring AOP 动作在源码中的位置
初始化方法的后置处理器中
二、@EnableAspectJAutoProxy注解
1、@EnableAspectJAutoProxy注解中,将AspectJAutoProxyRegistrar类注入到了容器。
2、AspectJAutoProxyRegistrar类,注册了AspectJ相关的处理组件
AnnotationAwareAspectJAutoProxyCreator类。
3、AnnotationAwareAspectJAutoProxyCreator类,会自动创建代理。
4、类继承关系
AnnotationAwareAspectJAutoProxyCreator
extendsAspectJAwareAdvisorAutoProxyCreator
extendsAbstractAdvisorAutoProxyCreator
extends AbstractAutoProxyCreator # wrapIfNecessary()
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
//如果设置为 true,则表示使用CGLIB代理
boolean proxyTargetClass() default false;
boolean exposeProxy() default false;
}
java
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//注册了AspectJ相关的处理组件
//AnnotationAwareAspectJAutoProxyCreator.class-自动代理创建器
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy != null) {
//设置代理方式,获取的就是@EnableAspectJAutoProxy中设置的proxyTargetClass的值
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}
}
三、源码路径
AnnotationConfigApplicationContext #AnnotationConfigApplicationContext() #refresh();
AbstractApplicationContext #refresh() #finishBeanFactoryInitialization() ->beanFactory.preInstantiateSingletons();
DefaultListableBeanFactory #preInstantiateSingletons() ->getBean(beanName);
AbstractBeanFactory #getBean() ->doGetBean() ->createBean();
AbstractAutowireCapableBeanFactory #createBean() ->doCreateBean() ->createBeanInstance();
populateBean();
initializeBean();
AbstractAutowireCapableBeanFactory #initializeBean() ->applyBeanPostProcessorsAfterInitialization() ->processor.postProcessAfterInitialization(result, beanName);
AbstractAutoProxyCreator #postProcessAfterInitialization() ->wrapIfNecessary() ->createProxy();
四、Spring如何实现多层代理
1、JDK代理中,存在多个代理的话,这些代理的handler不能是同一个,不然无法实现多层代理。
2、CgLib不能代理之后再代理。
3、Spring以链式调用的方式,实现多层代理。