首页 文章

Spring建议:在类或接口上代理机制vs @Transactional

提问于
浏览
2

Spring doc有两个建议:

Spring建议您只使用@Transactional注释来注释具体类(以及具体类的方法),而不是注释接口 . 您当然可以将@Transactional注释放在接口(或接口方法)上,但这只能在您使用基于接口的代理时按预期工作 . Java注释不是从接口继承的事实意味着如果您使用基于类的代理(proxy-target-class =“true”)或基于编织的方面(mode =“aspectj”),那么事务设置是代理和编织基础设施无法识别,并且该对象不会被包装在事务代理中,这将是非常糟糕的 .

(来自http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html

Spring AOP使用JDK动态代理或CGLIB为给定目标对象创建代理 . (只要有选择,JDK动态代理就是首选) .

(来自http://static.springsource.org/spring/docs/3.0.x/reference/aop.html#aop-understanding-aop-proxies

我是否正确理解为了遵循这两个建议,我需要在具体类上有 @Transactional 注释,但仍然提供包含所有事务方法的接口(这个类实现),以便Spring可以使用JDK dynamix代理来实现这个接口?

1 回答

  • 2

    它的工作原理如下

    • 有一个带方法的业务接口,不要用 @Transactional 注释接口方法

    • 为上面定义的接口编写一个实现类,并使用 @Transactional 在impl类中注释方法

    由于Spring建议使用基于接口的JDK动态代理,因此我们需要有适当的业务接口 . 另外,如上所述

    Java注释不是从接口继承的

    我们需要使用 @Transactional 注释具体/实现类方法

相关问题