在同一个类中调用另一个方法没有触发 Spring AOP 的问题

有这么一个类:

@Service
@Sl4j
public class SomeService {

    public void hello(String someParam) {
        log.info("---SomeService: hello invoked, param: {}---", someParam);
        test();
    }

    public void test() {
        log.info("---SomeService: test invoked---");
    }
}

有这么一个AOP

// 定义切点
@Pointcut(value = "execution(public * com.test.SomeService.test())")
private void activeAspect() {
}

@AfterReturning(value = "activeAspect()")
private void activeSuccess(JoinPoint joinPoint) {
	// todo 业务处理
	System.out.println("test");
}

我们的计划是通过定义切点,处理SomeService.test()返回之后的业务逻辑,但是实际情况是这个AOP一直不生效。

原因是test()方法不是直接被调用的,而是通过SomeService.hello()方法间接被调用的。

Spring AOP 是使用了一个代理对象来包装目标对象, 并拦截目标对象的方法调用。在目标对象中调用自己类内部实现的方法时, 这些调用并不会转发到代理对象中, 甚至代理对象都不知道有此调用的存在。

解决办法:

@Service
@Sl4j
public class SomeService {
	@Autowired
    private SomeService self;

    public void hello(String someParam) {
        log.info("---SomeService: hello invoked, param: {}---", someParam);
        self.test();
    }

    public void test() {
        log.info("---SomeService: test invoked---");
    }
}

以上参考:https://segmentfault.com/a/1190000008379179,实测有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值