Spring-AOP源码分析

一、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以链式调用的方式,实现多层代理。