• SpringBoot下的代理注解


    @EnableAspectJAutoProxy

    1. @Target(ElementType.TYPE)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Import(AspectJAutoProxyRegistrar.class)
    5. public @interface EnableAspectJAutoProxy {
    6. // 是否代理目标对象,ture:使用CGLIB代理 fasle:使用JDK代理
    7. boolean proxyTargetClass() default false;
    8. // 是否暴露代理对象
    9. boolean exposeProxy() default false;
    10. }

    @EnableAspectJAutoProxy 是一个Spring框架的注解,用于启用基于AspectJ的代理支持。它允许您使用面向切面编程 (AOP) 来实现横切关注点,例如日志记录、性能监控、事务管理等。

    具体来说,@EnableAspectJAutoProxy 做了以下几件事情:

    1、启用代理机制:它启用了Spring容器的代理功能,允许Spring创建代理对象,以拦截和处理方法调用,正常来说是不需要主动去加该注解,因为由于SpringBoot的自动配置会将代理机制自动开启。截取源代码中的注释。

    1. package org.springframework.boot.autoconfigure.aop;
    2. /**
    3. * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
    4. * Auto-configuration} for Spring's AOP support. Equivalent to enabling
    5. * {@link EnableAspectJAutoProxy @EnableAspectJAutoProxy} in your configuration.
    6. *

    7. * The configuration will not be activated if {@literal spring.aop.auto=false}. The
    8. * {@literal proxyTargetClass} attribute will be {@literal true}, by default, but can be
    9. * overridden by specifying {@literal spring.aop.proxy-target-class=false}.
    10. *
    11. * 大致意思就是:
    12. * 可以使用@EnableAspectJAutoProxy启用AOP的相关能力。
    13. * 如果要关闭AOP的能力可以配置「spring.aop.auto=false」,另外注解中的「proxyTargetClass」
    14. * 属性默认为true,代表使用CGLIB代理,「SpringBoot 2.0以后默认」;也可自行配置使用
    15. *「spring.aop.proxy-target-class=false」使用JDK代理,或者「proxyTargetClass=false」
    16. * @author Dave Syer
    17. * @author Josh Long
    18. * @since 1.0.0
    19. * @see EnableAspectJAutoProxy
    20. */
    21. @Configuration(proxyBeanMethods = false)
    22. @ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
    23. public class AopAutoConfiguration {
    24. @Configuration(proxyBeanMethods = false)
    25. @ConditionalOnClass(Advice.class)
    26. static class AspectJAutoProxyingConfiguration {
    27. .....

    2、使用AspectJ注解:它启用了AspectJ注解,使您可以在Spring中使用 @Aspect@Before@After@Around 等注解来定义切面。

    3、配置代理模式:它允许您选择代理的模式,通常是 proxyTargetClassexposeProxy 选项。proxyTargetClass 默认为 false,表示使用标准的JDK动态代理,如果将其设置为 true,则使用CGLIB代理。exposeProxy 默认为 false,表示不将当前代理对象暴露给切面,如果将其设置为 true,可以通过 AopContext.currentProxy() 获取当前代理对象。

    以下是一个示例:

    1. import org.springframework.context.annotation.Configuration;
    2. import org.springframework.context.annotation.EnableAspectJAutoProxy;
    3. @Configuration
    4. @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
    5. public class AppConfig {
    6. // Other bean configurations can go here
    7. }

    典型应用

    1、解决由于代理实现的机制的失效问题:

            比如@Transactional事务、@Async异步,Service内部方法自调用导致的失效

    1. // 配置暴露代理类,通过获取代理类调取方法
    2. ((TUserService) AopContext.currentProxy()).updateRealNameById(id, realName);

            

    参考文章:【精选】Spring源码深度解析:十四、@Aspect方式的AOP上篇 - @EnableAspectJAutoProxy_enableaspectjautoproxy 是哪个包_代码的知行者的博客-CSDN博客

  • 相关阅读:
    求1~100000之间所有的“水仙花数”,并输出
    docker-MySQL 8 主从搭建
    目标跟踪常见训练数据集格式
    Linux入门——基础指令
    MySQL的视图
    如何在 Next.js 中构建进度条指示器
    搭建lamp平台
    计算机毕业设计 | SpringBoot+vue的家庭理财 财务管理系统(附源码)
    运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享
    旋转的正方体-第15届蓝桥杯第一次STEMA测评Scratch真题精选
  • 原文地址:https://blog.csdn.net/pp_fzp/article/details/133984435