Spring技术疑问:单个Bean可含多个@Transactional方法?类需public吗?
Spring事务相关问题解答
问题1:单个Bean中是否可以拥有多个@Transactional方法?若在另一个Bean中依次调用这些方法,事务能否正常工作?
单个Bean完全可以包含多个标注@Transactional的方法,在另一个Bean中依次调用这些方法时,事务会各自独立生效。
Spring的事务代理基于方法调用逻辑:每次从外部Bean调用目标Bean的@Transactional方法时,都会触发对应的事务边界。比如你提供的代码中,B.doSomeStuff()调用a.actionA()时,会开启一个独立事务,执行完成后提交或回滚;接着调用a.actionB()时,会再启动一个全新事务,两者的事务生命周期互不干扰。
另外注意代码里的拼写错误:@Trancational需修正为@Transactional,否则注解不会生效。
修正后代码示例:
class A { @Transactional public void actionA() {} @Transactional public void actionB() {} } class B { private A a; void doSomeStuff() { a.actionA(); a.actionB(); } }
问题2:包含@Transactional注解的Bean类是否必须是public的?
包含@Transactional注解的Bean类不强制要求是public,但有几个关键注意点:
- 如果是通过Spring组件扫描(如
@Component、@Service等注解)注册的Bean,非public类(比如包私有)只要能被Spring扫描到(例如和扫描配置处于同一包下),Spring可通过CGLIB生成代理类实现事务增强,但这类类不能是final(CGLIB需通过继承类生成代理)。 - 官方文档更推荐使用public类作为Bean,避免在不同Spring版本或复杂场景下出现代理失效问题。
- 你提到的标注
@Transactional的方法必须是public是正确的:Spring的事务代理(无论JDK动态代理还是CGLIB)仅处理public方法上的事务注解,非public方法的@Transactional会被直接忽略,无法生效。
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

