Spring-AOP SpringBoot自动配置和启动Spring AOP

痛定思痛。 2022-12-15 11:17 243阅读 0赞

SpringBoot 会使用 @Conditional* 注解来进行判断是否需要自动启动 AOP,如果 classpath 下有 spring-aop 的 jar 和有 EnableAspectJAutoProxy 类等,它就会自动开启 spring-aop。并且此自动配置类还能通过 SpringBoot 的配置文件 application.properties 中配置的 AOP 相关属性进行选择,使用哪一种代理模式,非常智能。

  1. package org.springframework.boot.autoconfigure.aop;
  2. @Configuration
  3. @ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
  4. @ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
  5. public class AopAutoConfiguration {
  6. @Configuration
  7. @EnableAspectJAutoProxy(proxyTargetClass = false)
  8. @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = true)
  9. public static class JdkDynamicAutoProxyConfiguration {
  10. }
  11. @Configuration
  12. @EnableAspectJAutoProxy(proxyTargetClass = true)
  13. @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = false)
  14. public static class CglibAutoProxyConfiguration {
  15. }
  16. }

总结

如果我们使用的 SpringBoot,只需要在 properties 文件中进行相关配置,或者不配置直接采用默认配置即可,我们不需要在启动类加上启动 Aop 的注解 EnableAspectJAutoProxy

如果我们使用的是非Springboot模式,我们需要在配置类上加上 EnableAspectJAutoProxy 此注解。

=============

@EnableAspectJAutoProxy

作用

  开启切面编程功能;

使用

  1. @Configuration
  2. @EnableAspectJAutoProxy
  3. public class AppConfig {
  4. }

原理

这里写图片描述

Bean定义扫描阶段

  1. 通过@Import导入AspectJAutoProxyRegistrar;
  2. 通过@Configuration解析添加AnnotationAwareAspectJAutoProxyCreator定义;

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(AspectJAutoProxyRegistrar.class)
    public @interface EnableAspectJAutoProxy {

    1. /**
    2. * Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
    3. * to standard Java interface-based proxies. The default is {@code false}.
    4. */
    5. boolean proxyTargetClass() default false;
    6. /**
    7. * Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}
    8. * for retrieval via the {@link org.springframework.aop.framework.AopContext} class.
    9. * Off by default, i.e. no guarantees that {@code AopContext} access will work.
    10. * @since 4.3.1
    11. */
    12. boolean exposeProxy() default false;

    }

这里写图片描述

AnnotationAwareAspectJAutoProxyCreator解析

  AnnotationAwareAspectJAutoProxyCreator本质是BeanPostProcessor,容器启动过程中会调用registerBeanPostProcessors()进行BeanPostProcessor的创建和初始化;在bean创建和初始化阶段,符合条件的bean初始化完成后,通过postProcessAfterInitialization生成代理类,如下所示:
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读