当前位置: 首页 > 面试题库 >

我应该在接口定义或实现类中的@Transactional注解:放在哪里?

邢和光
2023-03-14
问题内容

来自代码标题的问题:

@Transactional (readonly = true)
public interface FooService {
   void doSmth ();
}


public class FooServiceImpl implements FooService {
   ...
}

public interface FooService {
   void doSmth ();
}

@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
   ...
}

问题答案:

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

Spring团队的建议是,您只应使用注释对具体的类进行@Transactional注释,而不是对接口进行注释。您当然可以将@Transactional注释放置在接口(或接口方法)上,但这仅在您使用基于接口的代理时才能按预期使用。注解
未继承 的事实意味着,如果您使用的是基于类的代理,则基于类的代理基础结构将无法识别事务设置,并且该对象也不会包装在事务性代理中(这肯定是 不好的
) 。因此,请务必听取Spring团队的建议,仅使用注释对具体类(以及具体类的方法)进行@Transactional注释。

注意:由于此机制基于代理,因此将仅拦截通过代理传入的“外部”方法调用。
这意味着“自调用”,即目标对象内的一种调用目标对象其他方法的方法,即使被调用的方法标有@Transactional!,也不会在运行时导致实际事务。

(重点放在第一句,其他重点放在原始句中。)



 类似资料:
  • 问题内容: 来自代码标题的问题: 与 问题答案: Spring团队的建议是,你只能使用注释对具体的类进行·注释,而不是对接口进行注释。你当然可以将@Transactional注释放在接口(或接口方法)上,但这仅在你使用基于接口的代理时才可以按预期使用。注解未继承的事实意味着,如果你使用的是基于类的代理,则基于类的代理基础结构将无法识别事务设置,并且该对象也不会包装在事务性代理中(这肯定是不好的)

  • 问题内容: 放置注释的最佳做法是什么?我应该注释接口方法还是实现? 问题答案: 好问题。我一直把它放在实现中。也许是因为它是实现细节,而不是抽象。 你可能希望不同的实现具有不同的事务行为。 El Guapo指出,除此之外,在接口上使用代理策略还可能引发更多问题。

  • 我正在使用Spring开发一个应用程序。我需要使用注释。我有和,这样。这里我很困惑应该在哪里保留注释。 我应该用注释接口还是实现?这两种做法有何不同?

  • 我正在尝试为没有它们的包装提供类型: 我在带有打字稿 2.4.2 的 webpack 中使用 ts-loader,并且在 tsconfig.json 中设置了以下类型根: 我试图模仿: < code>index.d.ts中包含以下内容: 但是错误仍然存在。我做错了什么?我应该把那些自定义的. d.ts文件放在哪里? 和任何其他类型根之间有什么区别?为什么TypeScript会区别对待它们?

  • 问题内容: 首先,可能是我要问一些以前已经问过并回答过的问题,但我却无法找回搜索结果。一般而言(或到目前为止):)我们在服务层上定义事务注释,通常是Spring Hibernate Crud。 现在,我需要根据客户站点在域模型之间进行选择。假设客户端A使用我的域模型都很好,但是另一个客户端网站会给我一个Web服务而不是使用我们的域模型。 我应该替换哪一层。我认为必须是DAO,它将从Web服务获取我

  • 我查了Javadoc,什么也没有得到。我想知道这是怎么回事。 我找到了这个和这个,但这并不能消除我的疑虑。如果我漏了什么请告诉我。