4

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 代理?

4

1 回答 1

2

它像这样工作

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

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

由于 Spring 建议使用基于接口的 JDK 动态代理,因此我们需要准备好业务接口。另外,如前所述

Java注解不是从接口继承的

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

于 2013-05-22T08:40:47.940 回答