缓存切面自动装配是怎么加进去的

是通过spi的方式把自动配置类加进来,比如AOP是在
E:\spring-boot-2.2.2.RELEASE\spring-boot-project\spring-boot-autoconfigure\target\spring-boot-autoconfigure-2.2.2.RELEASE.jar!\META-INF\spring.factories
文件里面org.springframework.boot.autoconfigure.aop.AopAutoConfiguration

AopAutoConfiguration里面
1————————————————

1. @ConditionalOnProperty加载配置文件spring.aop开头的配置(读取yml配置文件里面spring.aop.auto = true 的配置,如果配置了这个,说明要用到AOP的自动配置功能,当然这个默认值是true,你不需要手动开启,因为框架自动开启了,如果你不需要的话,你可以设置为false)
2. 如果你想给AOP手动弄进来需要添加@EnableAspectJAutoProxy注解,添加了这个注解就代表添加了AOP的功能.注意,这个和上面是不一样的,上个是开启AOP的自动配置,这个是增加AOP的功能.


1————————————————

(一)@EnableAspectJAutoProxy注解添加AOP功能做的事情

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Import(AspectJAutoProxyRegistrar.class)
  5. public @interface EnableAspectJAutoProxy {



首先@Import了org.springframework.context.annotation.AspectJAutoProxyRegistrar 类


org.springframework.context.annotation.AspectJAutoProxyRegistrar给AOP的入口类加入到了Spring容器里面(ConfigurationClassPostProcessor加入的???有待考证),


(二)AopAutoConfiguration类

这个类里面有个内部类

  1. @Configuration(proxyBeanMethods = false)
  2. @ConditionalOnClass(Advice.class)
  3. static class AspectJAutoProxyingConfiguration {
  4. @Configuration(proxyBeanMethods = false)
  5. @EnableAspectJAutoProxy(proxyTargetClass = false)
  6. @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
  7. matchIfMissing = false)
  8. static class JdkDynamicAutoProxyConfiguration {
  9. }
  10. @Configuration(proxyBeanMethods = false)
  11. @EnableAspectJAutoProxy(proxyTargetClass = true)
  12. @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
  13. matchIfMissing = true)
  14. static class CglibAutoProxyConfiguration {
  15. }
  16. }



@EnableAspectJAutoProxy 主要看这个注解,是加入AOP功能的注解,看到源码.默认是采用CGLib的动态代理的,如果你想用JDK的动态代理.就在yml配置spring.aop.proxy-target-class = false .