Java 如何配置要使用的事务管理器,而不必覆盖所有@Transactional方法
长时间侦听器第一次调用 我们有一个AbstractService.java类,它包含公共事务逻辑。并非此类中的所有方法都是事务性的。其中一个是用spring的@Transactional注释注释的 现在AbstractService的每个实现都可能有一个不同的事务管理器。这可以通过重写抽象类中的方法在具体类中配置,并提供不同的tx管理器: @事务(值=事务管理器) 无法将事务管理器名称传递给抽象类,因为“注释属性Transactional.value的值必须是常量表达式” 因此,据我所知,配置事务管理器有两种方法:Java 如何配置要使用的事务管理器,而不必覆盖所有@Transactional方法,java,spring,transactions,Java,Spring,Transactions,长时间侦听器第一次调用 我们有一个AbstractService.java类,它包含公共事务逻辑。并非此类中的所有方法都是事务性的。其中一个是用spring的@Transactional注释注释的 现在AbstractService的每个实现都可能有一个不同的事务管理器。这可以通过重写抽象类中的方法在具体类中配置,并提供不同的tx管理器: @事务(值=事务管理器) 无法将事务管理器名称传递给抽象类,因为“注释属性Transactional.value的值必须是常量表达式” 因此,据我所知,配置事
@Transactional(timeout = 60, value = TRANSACTION_MANAGER)
@Override
public String editEntity(Integer id, Integer columnPosition, Object value) {
return super.editEntity(id, columnPosition, value);
如何配置事务,而不必覆盖所有事务方法来指定事务管理器?我建议您将
抽象服务重构为三类:
- 第一个类是当前的
抽象服务
,它的接口、方法签名等,以保持与任何现有子类的二进制兼容,但所有实现都已删除李>
- 第二个类包含所有事务性的业务逻辑,因此它使用
@transactional
注释(在类级别使用正确的事务管理器)李>
- 第三个类包含所有非事务性业务逻辑李>
现在,您只需将最后两个类自动连接到重构的抽象服务
,它只是将传入的方法调用委托给移动到新创建的类之一的实现。感谢您的回复!第二类和第三类是抽象的吗?逻辑首先在AbstractService中的原因是,ConcreteClassA和ConcreteClassB可以扩展和访问公共逻辑。我正试着对你的答案感到困惑。在ClassA和ClassB场景中,这些是您的第二个类吗?在这种情况下,开始使用这种结构的主要原因将不复存在,因为现在逻辑将需要同时存在于两个类中。我可能误解了你的意思,我的想法是将AbstractService重构为一个抽象,委托给两个具体的类,一个是事务类,一个是非事务类。因此,当前扩展AbstractService的类中没有一个需要更改,我将在重构的基础上接受这个答案,以将事务方法分解为自己的类。另外,它还提出了一个解决方案,这是一个额外的优点。解决这个问题的另一种方法是使用抽象[SpecificTxMngr]服务扩展AbstractService,该服务覆盖所有事务方法并指定不同的txmngr。然后,每个需要特定txmngr的具体类将重写相关的抽象服务。这并不像公认的答案那样是正统的设计模式,但在每个开发人员的生活中总有一天需要接受继承。在我的特殊情况下,继承解决方案似乎更符合AbstractService的意图。