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

时间:2013-05-22 08:24:37

标签: java spring transactions aop spring-aop

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 个答案:

答案 0 :(得分:2)

它像这样工作

  1. 拥有方法的业务接口,不要使用@Transactional

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

  4. 在impl类中注释方法

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

      

    Java注释不是从接口继承的

    我们需要使用@Transactional

    注释具体/实现类方法