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

使用私有方法的Spring Boot事务传播

於德馨
2023-03-14

根据我的理解,在Spring Boot中不能代理私有方法。因此,@Transactional不能放在私有方法上。这让我想知道,如果中间有一个或多个私有方法,事务会传播吗?例如,以下代码块等效吗

class SomeClass{

@Autowired Dao dao;
 
@Transactional(propagation = Propagation.REQUIRED)
public bigMethod(int someArgument){
  Data data1 = process(someArgument);
  Data data2 = process(someArgument+1);
  this.dao.save(data1);
  this.dao.save(data2);
}

}

上述是否等于:

class SomeClass{

    @Autowired Dao dao;

    @Transactional(propagation = Propagation.REQUIRED)
    public bigMethod(int someArgument){
      Data data1 = process(someArgument);
      Data data2 = process(someArgument+1);
      doSave(data1);
      doSave(data2);
    }
    
    private void doSave(Data data){
     this.dao.save(data);
    }

请注意,第二个代码在两者之间添加了一个私有方法。还有刀。另一个类中的save()方法如下所示:

public class DAO{
 @Autowired Repository repo;
 @Transactional(propagation = Propagation.REQUIRED)   
  public void save(Data data){
  repo.save(data);
  }
 }

共有1个答案

季博
2023-03-14

为了让Spring为您提供事务传播等服务,它需要能够在调用之间拦截或“插入自身”。

当您调用dao.big方法时,道对象实际上并不是道类的一个实例,而是道类的一个Spring AOP代理,它也有一个大方法函数。当您在AOP代理上调用大方法时,Spring会添加它的服务,例如事务,然后调用您的大方法类。

一旦你进入bigmethod函数,你只是在一个常规的Java函数中,Spring看不到你所做的任何函数调用。因此,如果在bigmethod中你调用另一个Java函数,如保存,Spring将看不到它,也不能再添加任何事务服务。

为了从Spring获得更多服务,您必须将save移动到另一个bean,并获得该bean的句柄,该句柄将再次成为包含save的类的AOP代理。

一旦您拥有了AOP代理,当您调用它时,Spring将再次为您提供事务服务,即使调用点位于私有函数内。

 类似资料:
  • 我试图在测试的类中模拟一个私有方法,如下所示。 现在我需要测试方法和mock。 我尝试创建间谍的上述类,但该方法得到调用时,我这样做下面 在第二行本身被调用。而且,不会被模仿。 也许我用错误的方式创建了间谍对象?无法执行

  • 本文向大家介绍springboot开启声明式事务的方法,包括了springboot开启声明式事务的方法的使用技巧和注意事项,需要的朋友参考一下 springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatl

  • 问题内容: 您如何看待使用 私有静态方法 ? 就个人而言,我更喜欢使用 静态 私有方法而不 是非 静态 方法,只要它不需要访问任何实例字段即可。 但是我听说这种做法违反了OOP原则。 编辑:我想从样式的角度来看,而不是性能。 问题答案: 一个方法本身本身并没有违反OOP,但是当类上有很多不需要(也不能*)访问实例字段的方法时,您就不会以OO方式进行编程,因为“对象”表示状态+一起定义的状态操作。如

  • 问题内容: 如何使用方法句柄调用私有方法? 据我所知,只有两种可公开访问的实例: 也不允许无限制的私人访问。 有非公开组织可以满足我的需求。是否有一些公开的方式来获取它(假设SecurityManager允许它)? 问题答案: 事实证明,可以使用Lookup#unreflect(Method)并暂时使方法可访问(除非在程序初始化期间完成,否则可能会引入小的安全性问题)。 这是Thorben的答案的

  • 问题内容: 我们有一个Hibernate / Spring应用程序,它具有以下Spring Bean: 将应用程序连接在一起时,在hibernate实体中使用私有构造函数时,会出现以下错误: 实体是典型的域对象,例如Employee等。 当将构造函数的可见性修改器更改为打包(或公共)时,应用程序运行良好,并且实体存储/加载到数据库中。我们/如何在Spring / Hibernate事务管理中使用私