spring aop注解失效

Posted 临_择

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来调相应的方法。
@Service
public class DmzService {
    
    public void saveAB(A a, B b) {
        saveA(a);
        saveB(b);
    }

    @Transactional
    public void saveA(A a) {
        dao.saveA(a);
    }
    
    @Transactional
    public void saveB(B b){
        dao.saveB(a);
    }
}

saveAB方法中调用了本类中的saveAsaveB方法,这就是自调用。自调用会导致aop失效。

解决方法

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

@Autowired
private ApplicationContext applicationContext;

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

以上是关于spring aop注解失效的主要内容,如果未能解决你的问题,请参考以下文章

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

揭秘 Spring AOP 失效的罪因!

AOP获取方法注解实现动态切换数据源

java八股系列——spring事务失效场景

java笔记java中@Transactional注解的使用及其失效情景

Spring 事务失效的7种场景