当前位置: 首页 > 知识库问答 >
问题:

Spring@Transaction是否适用于抽象类的具体方法

秦宜修
2023-03-14

来自spring参考文档

Spring建议您只使用@Transactional注释来注释具体的类(以及具体类的方法),而不是注释接口。您当然可以将@Transactional注释放置在接口(或接口方法)上,但只有在使用基于接口的代理时,它才会像您所期望的那样工作。Java注释不是从接口继承的,这意味着如果您使用的是基于类的代理(proxy-target-class=“true”)或基于编织的方面(mode=“AspectJ”),那么事务设置不会被代理和编织基础结构识别,并且对象不会包装在事务代理中,这显然是不好的。

虽然它只讨论接口,抽象类也被认为是非具体的。

public abstract class BaseService{
//here is a concrete method
@Transactional
public void updateData{
//do stuff using dao layer
}
public class SpecialService extends BaseService{
//body of class
}

共有1个答案

卞经业
2023-03-14

假定您已经正确地配置了Spring事务管理,那么在抽象超类上使用@transactional将会起作用,因为@transaction本身是用@inherited注释的,从它的Javadoc我们有:

指示自动继承批注类型。如果继承的元批注存在于批注类型声明上,并且用户在类声明上查询批注类型,而类声明没有此类型的批注,则将自动查询该类的超类以获得批注类型。这个过程将重复进行,直到找到该类型的注释,或者到达类层次结构(对象)的顶部。如果没有超类具有此类型的注释,则查询将指示所讨论的类没有此类注释。

请注意,如果带注释的类型用于注释类以外的任何内容,则此元注释类型不起作用。还要注意,这个元注释只导致注释从超类继承;已实现接口上的注释不起作用。

 类似资料:
  • 我知道抽象类可能包含抽象和具体方法(即主体实现)。我的问题是:子类可以从抽象超类继承/覆盖具体方法吗?其次,它们必须以实现抽象方法的方式实现具体方法吗?

  • 问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)

  • 我正在使用AspectJ在类级别和方法级别实现注释驱动程序方面,以用于使用基于Spring代理的AOP的Spring应用程序。 当AnnotationTimeoutAspect暴露于Spring Application并使用时 对于Grails应用程序,设置为Config.groovy或者对于Spring应用程序

  • 我正在尝试让Spring事务管理在我的新Spring Boot MyBatis应用程序中工作。 到目前为止,我已经设法让一切都以最小的问题工作——它只是让注释正常运行。目前,无论方法是否被注释,所有语句都会立即提交。 Spring Boot为您提供了如此多的样板配置,以至于很难找到丢失的链接。 我的包含以下依赖项: 我的包含以下数据源配置: bean中不按预期运行的方法的一个简单示例如下: 引发异

  • 我想在我即将完成的一些工作中使用builder模式,它在一个层次结构中有几个类。基类将至少有9个字段要启动,各个子类可能会添加2-4个字段。这会很快失控,而builder模式正是出于这个原因吸引了我。我在书籍和文章中初步接触了builder模式。他们是有帮助的,但没有关于如何扩展这种模式。我试图自己实现这一点,但是我在每个子类的构造函数中遇到了麻烦,因为我不知道如何将构建器中收集的数据传递给超级类

  • 问题内容: 我之前了解到抽象类可以扩展具体类。尽管我没从JAVA设计师那里看到原因,但是没关系。我还了解到,扩展具体类的抽象类可以使重写的方法抽象。为什么?您可以提供有用的用例吗?我正在尝试学习设计模式,我不想错过任何东西。 这是示例: 问题答案: 如果我有一组想要默认实现的类(以便它们可以从扩展),并且想要强制提供自己的实现(在这种情况下使其抽象为子类会强制执行此操作。) 当然,此示例中的另一种