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

应该把@Transactional annotation:放在接口定义或实现类的什么位置?

公良育
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 {
   ...
}

问题答案:

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

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



 类似资料:
  • 问题内容: 来自代码标题的问题: 与 问题答案: 来自http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html Spring团队的建议是,您只应使用注释对具体的类进行注释,而不是对接口进行注释。您当然可以将注释放置在接口(或接口方法)上,但这仅在您使用基于接口的代理时才能按预期使用。注解 未继承 的事实意

  • 问题内容: 什么时候应该实现接口? 我们为什么要这样做? 它具有任何优势或安全性吗? 问题答案: 从这是什么“系列化”的事情怎么一回事?: 它使您可以获取一个对象或一组对象,将它们放在磁盘上或通过有线或无线传输机制发送,然后稍后,也许在另一台计算机上,逆转该过程:恢复原始对象。基本机制是将一个或多个对象展平为一维比特流,并将该比特流转换回原始对象。 就像《星际迷航》中的“运输者”一样,所有事情都是

  • 问题内容: 违反情况是“避免使用类似’ArrayList’的实现类型;而应使用接口”。 以下行将纠正违规: 为什么要用后者List代替ArrayList? 问题答案: 在具体类型上使用接口是实现良好封装和松散耦合代码的关键。 在编写自己的API时遵循这种做法甚至是个好主意。如果这样做,以后您会发现,将单元测试添加到代码中(使用Mocking技术),并在将来需要时更改基础实现会更容易。

  • 这句话刚从我脑海中浮现出来: 我知道Queue是一个接口,LinkedList类“实现”Queue拥有的所有方法(

  • 我试图在typescript中编写一个去Bounce函数,但不确定设置分配给setTimeout的变量的类型。我的代码如下所示:

  • 问题内容: 在阅读exploringflask.com时,我了解到最佳实践是使用两个不同的配置文件,一个用于开发,一个用于生产。我不知道是否将密钥放置在开发或生产配置中。 实例文件夹的私有性质使其非常适合用于定义不想在版本控制中公开的键。这些可能包括您应用的秘密密钥或第三方API密钥。 我认为不应共享密钥。我应该将密钥放入开发配置或生产配置中,还是应该为每个配置使用不同的密钥? 问题答案: 将密钥