You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:30:58