前言:在重构公司的风控系统的时候,发现旧代码中经常出现获取以后 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);
}