Spring Boot 1.5版开始,为PlatformTransactionManager添加了自定义选项
使用Spring Boot后,会自动完成与所使用技术相对应的PlatformTransactionManager接口实现类(如DataSourceTransactionManager、JpaTransactionManager、JtaTransactionManager等)的Bean定义。关于是否可以直接使用默认设置,可能还有一些微妙之处,我认为有一些参数最好进行一些定制。在这种情况下……我将介绍在Spring Boot上如何定制PlatformTransactionManager。
直到Spring Boot 1.4版本为止?
在Spring Boot 1.4之前,如果想要定制PlatformTransactionManager,需要使用以下任一方法进行操作。
- Spring Bootの自動定義は使わずに@Beanメソッドを用意してカスタマイズする方法(正攻法)
@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
return transactionManager;
}
@Autowiredメソッドを用意してSpring Bootが定義したBeanをカスタマイズする方法
@Autowired
void configureTransactionManager(AbstractPlatformTransactionManager transactionManager) { // Spring Bootが自動設定したBeanがインジェクションしてカスタマイズ
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
}
从Spring Boot 1.5版本(预计在1月底发布)开始,有哪些新功能?
除了上述的方法,从Spring Boot 1.5开始,您还可以通过将实现org.springframework.boot.autoconfigure.transaction.PlatformTransactionManagerCustomizer接口的Bean注册到DI容器中来进行自定义。
public interface PlatformTransactionManagerCustomizer<T extends PlatformTransactionManager> {
void customize(T transactionManager);
}
我认为这个机制对于想要在多个应用程序中共享自定义逻辑的情况非常有用。
PlatformTransactionManagerCustomizer 的内置实现
实际上,Spring Boot内置提供了实现了PlatformTransactionManagerCustomizer接口的类。通过利用Spring Boot提供的内置实现,可以自定义AbstractPlatformTransactionManager中定义的以下属性的值。(gh-7561)
-
- デフォルトのトランザクションタイムアウト時間(秒)
- コミット時にエラーが発生した際にロールバック処理を行うか否かのフラグ(デフォルト値はfalse=ロールバックメソッドは呼び出さない)
spring.transaction.default-timeout=30
spring.transaction.rollback-on-commit-failure=true
注意:
关于Spring事务超时值的处理,《MyBatis-Spring 1.3》版本开始已经可以与Spring事务超时值进行协调!!请查看相关文章《Spring事务超时值的使用方法是什么?》,关于是否需要一个标志来指示在发生错误时进行回滚处理,《使用Spring的DataSourceTransactionManager会在发生错误时进行提交吗!?》请参考。
创建一个实现PlatformTransactionManagerCustomizer接口的类并对其进行定制的方法。
如果想要在多个应用程序中共享自定义逻辑,创建一个实现PlatformTransactionManagerCustomizer接口的实现类来进行定制化可能是个好方法。(类似于提供共享库的想法)
@Component
public class MyPlatformTransactionManagerCustomizer
implements PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> {
@Override
public void customize(AbstractPlatformTransactionManager transactionManager) {
// ... カスタマイズロジックを実装する
}
}
注意:
只有当Spring Boot生成的PlatformTransactionManager可以分配给PlatformTransactionManagerCustomizer的范型类型时,customize方法才会被调用。
使用Lambda表达式进行自定义的方法(Java SE 8+)
在Java SE 8中,您可以使用Lambda表达式来使用PlatformTransactionManagerCustomizer的customize方法进行即席实现,而无需创建像上述类一样的应用程序特定的定制。
@Bean
PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> transactionManagerCustomizer() {
return transactionManager -> {
// ... カスタマイズロジックを実装する
};
}
警告:
使用Lambda表达式时,对于指定为PlatformTransactionManagerCustomizer的泛型类型,customize方法的调用控制将不起作用(即被视为指定为PlatformTransactionManager泛型类型…)。因此,请注意,如果Spring Boot生成的PlatformTransactionManager无法分配给指定的泛型类型,则会引发ClassCastException异常!!
12/30 15:40 添加
由于已对ClassCastException进行了处理,因此将与创建类时的相同操作效果一致!!!
PlatformTransactionManagerCustomizer的应用顺序
PlatformTransactionManagerCustomizer可以包含Spring Boot的内置实现(TransactionProperties),并且可以应用多个。当将多个PlatformTransactionManagerCustomizer注册到DI容器时,其行为在默认情况下是不确定的。如果想要控制顺序,可以…
@org.springframework.core.annotation.Orderを付与
org.springframework.core.Orderedインタフェースを実装
根据我的环境,似乎不可以在Spring Boot的内置实现(TransactionProperties)之后进行该操作实现,但是这样做应该不会造成问题。
整理
尽管尚未发布,但从Spring Boot 1.5开始,增加了支持自定义PlatformTransactionManager的接口(PlatformTransactionManagerCustomizer)哦~
所以…
以下的属性看起来可能具有较高的自定义频率,现在可以在application.properties(或application.yml)中进行自定义哦~
-
- デフォルトのトランザクションタイムアウト時間(秒)
- コミット時にエラーが発生した際にロールバック処理を行うか否かのフラグ
我介绍了这件事。
预计Spring Boot 1.5将在新年开始时发布RC1版本,并于1月底发布正式版。一旦RC1发布,我可能会研究一下与Spring Boot 1.4的区别。
最后
也许这篇文章是今年我在Qiita的最后一篇吧~我想明年也会随心所欲地投稿,如果能在任何方面对大家有所帮助,那就再好不过了。(如果有任何不合适的地方,或者有任何建议,请务必留言告诉我哦!)
现在是今年的最后两天了,祝大家新年快乐~