Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 把@Transactional放在哪里?在接口规范或实现中?_Java_Spring_Interface_Transactions - Fatal编程技术网

Java 把@Transactional放在哪里?在接口规范或实现中?

Java 把@Transactional放在哪里?在接口规范或实现中?,java,spring,interface,transactions,Java,Spring,Interface,Transactions,放置@Transactional注释的最佳实践是什么?我应该注释接口方法还是实现?好问题。我总是把它放在实现中。也许是因为它是一个实现细节,而不是一个抽象 您可能希望不同的实现具有不同的事务行为 El Guapo指出,除此之外,在接口上添加代理策略可能会产生更多问题。我认为,这实际上取决于您的应用程序架构。这取决于你如何代理你的类。如果将应用程序设置为proxy target class='true'(在应用程序上下文中,如果对界面进行注释,则不会获取@Transactional信息 查看更多信

放置
@Transactional
注释的最佳实践是什么?我应该注释接口方法还是实现?

好问题。我总是把它放在实现中。也许是因为它是一个实现细节,而不是一个抽象

您可能希望不同的实现具有不同的事务行为


El Guapo指出,除此之外,在接口上添加代理策略可能会产生更多问题。

我认为,这实际上取决于您的应用程序架构。这取决于你如何代理你的类。如果将应用程序设置为
proxy target class='true'
(在应用程序上下文中,如果对界面进行注释,则不会获取
@Transactional
信息

查看更多信息

Spring建议您仅使用@Transactional注释对具体类(以及具体类的方法)进行注释,而不是对接口进行注释。您当然可以将@Transactional注释放置在接口(或接口方法)上,但这仅在使用基于接口的代理时才起作用。Java注释不是从接口继承的事实意味着如果使用基于类的代理(proxy target class=“true”)或基于编织的方面(mode=“aspectj”),则代理和编织基础结构无法识别事务设置,并且对象不会包装在事务代理中,这将是非常糟糕的


虽然事务管理在很多情况下都是实现细节,但通常它也是一个接口细节。例如,在定义应用程序的服务接口时,可以考虑将“代码> @事务性< /代码>放入接口定义中,以明确地说明您使用的传播策略。

< P>我不u。在我的系统上安装se接口,因为到目前为止,我还不知道是否有可能在上面实现任何东西。所以我在实现上添加了注释,我相信Spring会让一切都对我正确

我不认为所有的类都必须有接口。我看到很多架构都有很多模式,它们都喜欢接口。但有一个问题:如果你把Spring注释放到接口中,出于某种原因,你想用另一种方法来处理实现类在这个接口上的事务,你就不能这样做哦,那是我错了吗


干杯。

提出了另一个非常好的观点。评论不错!有人知道JTA规范对注释的说明吗?提供者必须检查注释的超类型方法签名吗?更重要的是,如果用非注释版本覆盖注释方法,注释处理器/反射会如何理解提示?+1。我正在编辑您的答案以添加报价