Springboot 启动时会扫描autoconfigure jar包中的META-INFO中spring.factories中的EnableAutoConfiguration注解下的AopAutoConfiguration类
AopAutoConfiguration类会根据springboot的spring.aop.auto和spring.aop.proxy-target-class的属性(高版本默认cglib)去选择加载AopAutoConfiguration
AopAutoConfiguration上的@EnableAspectJAutoProxy注解会被自动加载,所以不需要配置@EnableAspectJAutoProxy
@EnableAspectJAutoProxy被加载后,会自动加载AspectJAutoProxyRegistrar类,AspectJAutoProxyRegistrar里的AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)这行代码用来自动加载AnnotationAwareAspectJAutoProxyCreator类的BeanDefinition然后读取proxyTargetClass和exposeProxy的值,并且设置到BeanDefinition中去
AbstractAutowireCapableBeanFactory里init时会调用applyBeanPostProcessorsAfterInitialization(或者applyBeanPostProcessorsBeforeInitialization)时会遍历到AnnotationAwareAspectJAutoProxyCreator然后调用AbstractAutoProxyCreator中前后切面的方法,然后wrapIfNecessary(因为spring的缓存中还没有这个对象)然后在调用createProxy创建代理对象
createProxy中会根据AnnotationAwareAspectJAutoProxyCreator的属性新建ProxyFactory并且设置advisors,然后调用getProxy
getProxy方法就是根据DefaultAopProxyFactory里createAopProxy返回的JdkDynamicAopProxy的AopProxy方法还是ObjenesisCglibAopProxy的AopProxy
去getProxy返回创建的代理类
最后创建
JdkDynamicAutoProxyConfiguration或者CglibAutoProxyConfiguration