开发者社区> 问答> 正文

如何解决Spring AOP切面执行顺序中方法A调用同类中的方法B,方法B上的切面不会生效的原因?

已解决

如何解决Spring AOP切面执行顺序中方法A调用同类中的方法B,方法B上的切面不会生效的原因?

展开
收起
去校区学技术 2022-04-01 07:58:39 982 0
1 条回答
写回答
取消 提交回答
  • 推荐回答

    解决方法:使用AopContext.currentProxy()获取到代理对象,然后通过代理对象调用对应的方法。还有个地方需要注意,以上方式还需要将Aspect的expose-proxy设置成true。

    @Component
    public class StrategyService{ 
        public PricingResponse getFactor(Map<String, String> pricingParams) { 
            // 做一些参数校验,以及异常捕获相关的事情 
            // 这里不使用this.loadFactor而是使用AopContext.currentProxy()调用,目的是解决AOP代理不支持方法自调用的问题 
            if (AopContext.currentProxy() instanceof StrategyService) { 
                return ((StrategyService)AopContext.currentProxy()).loadFactor(tieredPricingParams); 
            } else {
      
                // 部分实现没有被代理过,则直接进行自调用即可 
                return loadFactor(tieredPricingParams); 
            } 
        }
      
        @Override
        @StrategyCache(keyName = "key0001", expireTime = 60 * 60 * 2) 
        private PricingResponse loadFactor(Map<String, String> oricingParams) { 
            //代码执行 
        } 
    }
      
    //还有个地方需要注意,以上方式还需要将Aspect的expose-proxy设置成true。如果是配置文件修改:
     <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
    //如果是SpringBoot,则修改应用启动入口类的注解:
    @EnableAspectJAutoProxy(exposeProxy = true) 
    public class Application { 
    } 
    
    2022-04-01 07:59:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载