关于spring:一spring-aop注解失效

前言:在重构公司的风控系统的时候,发现旧代码中经常出现获取以后service的bean在调用办法的状况。起初才发现其中的问题。
如下:

private AccountActionProfileService me() {
    return applicationContext.getBean(AccountActionProfileService.class);
}
@Transactional
public void addAccountActionProfile() {
.......
 if (.....) {
        me().verifyBanAccountRule(target);
 }
}


@Async
public void verifyBanAccountRule(AccountActionProfileEntity accountAction, String originalAccountName) {
   .........
 }

起初才发现若没有me()办法而间接应用verifyBanAccountRule办法的话,该办法并没有被新的线程执行,还是在旧线程中串行执行。通过谷歌搜寻了一下,才晓得其起因。

起因

理解过spring的aop原理的同学应该都晓得spring的aop是基于cglib或jdk动静代理生成代理类,而咱们在办法中间接调用带有Aop注解的办法,实际上是通过以后对象的this指针拜访该办法,此时以后对象并不是代理对象,故下面公司的旧代码应用的是从spring容器中获取bean,再通过bean来调相应的办法。

解决办法

从spring容器中获取bean,再通过bean来调相应的办法。

@Autowired
private ApplicationContext applicationContext;

private AccountActionProfileService me() {
    return applicationContext.getBean(AccountActionProfileService.class);
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理