Spring Bean默认方法上的@Transactional注解是否生效?能否使用?
Spring Bean默认方法上的@Transactional是否生效?
核心结论
- 可以在默认(包访问权限)方法上标注
@Transactional注解,语法层面无问题,但Spring默认的动态代理机制下该注解不会生效。 - 不仅是默认方法,
protected、private方法上的@Transactional同样不会触发事务逻辑,只有public方法才会被Spring的事务代理处理。
原因分析
Spring的事务管理依赖AOP实现,默认采用动态代理(JDK动态代理或CGLIB代理):
- JDK动态代理仅针对接口的public方法生成代理;
- CGLIB代理虽然可以代理类的非public方法,但Spring的AOP框架默认只拦截public方法的注解逻辑,不会处理非public方法上的事务注解。
如果必须让非public方法的事务生效,需要切换到AspectJ织入(编译时或加载时织入),但这需要额外配置,并非Spring的默认行为。
验证示例
比如以下代码中,defaultMethod()上的@Transactional不会生效:
@Service public class DemoService { @Transactional void defaultMethod() { // 数据库操作不会被事务管理 } @Transactional public void publicMethod() { // 数据库操作会被事务管理 } }
内容的提问来源于stack exchange,提问作者Mahi
相关产品推荐
相关产品推荐

