今天在测试框架的时候,我想在一个service类的方法中调用 当前类的另一个方法(该方法通过@Transactional
开启事务),这时候发现被调用类的事务并没有生效。
1 | public boolean test1() { |
WHY? 搜索引擎一番查询之后,了解到问题的关键:
@Transactional 是基于aop生的代理对象开启事务的
PS:不了解代理模式的小伙伴,结尾有传送门
思路
spring 的事务是通过 aop 管理的
aop 会通过动态代理 为我们生成代理对象,aop 的功能(例如事务)都是在代理对象中实现的
aop 生成的代理类又在 spring 容器中,所以我们只要在 spring 容器中拿到当前这个bean 再去调用
test2()
就可以开启事务了。
解决
1 | import org.springframework.beans.BeansException; |
1 | public boolean test1() { |
ok!搞定!