Lorsque Spring Boot est utilisé, la définition Bean de la classe d'implémentation de l'interface PlatformTransactionManager
( DataSourceTransactionManager
, JpaTransactionManager
, JtaTransactionManager
, etc ...) correspondant à la technologie d'utilisation est automatiquement exécutée. Peut-il être utilisé par défaut? C'est un peu subtil et je pense que certains paramètres devraient être personnalisés. Cette fois, je vais vous présenter comment personnaliser PlatformTransactionManager
sur Spring Boot.
Jusqu'à Spring Boot 1.4, si vous vouliez personnaliser le PlatformTransactionManager
, vous deviez effectuer l'une des opérations suivantes:
@ Bean
sans utiliser la définition automatique de Spring Boot (méthode d'attaque directe)@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
return transactionManager;
}
@ Autowired
@Autowired
void configureTransactionManager(AbstractPlatformTransactionManager transactionManager) { //Les haricots automatiquement définis par Spring Boot sont injectés et personnalisés
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
}
En plus de la méthode ci-dessus, à partir de Spring Boot 1.5, il sera possible de personnaliser en enregistrant le Bean de la classe d'implémentation de ʻorg.springframework.boot.autoconfigure.transaction.PlatformTransactionManagerCustomizer` dans le conteneur DI.
Extrait de PlatformTransactionManagerCustomizer
public interface PlatformTransactionManagerCustomizer<T extends PlatformTransactionManager> {
void customize(T transactionManager);
}
Je pense que ce mécanisme est utile lorsque vous souhaitez partager la logique de personnalisation entre plusieurs applications.
En fait ... Spring Boot fournit une classe intégrée qui implémente l'interface PlatformTransactionManagerCustomizer
. L'implémentation intégrée fournie par Spring Boot vous permet de personnaliser les valeurs des propriétés suivantes définies dans ʻAbstractPlatformTransactionManager`. (gh-7561)
src/main/resources/application.properties
spring.transaction.default-timeout=30
spring.transaction.rollback-on-commit-failure=true
Note:
En ce qui concerne la gestion de la valeur du délai d'expiration de la transaction Spring, "[MyBatis-Spring 1.3 à la valeur du délai d'expiration de la transaction Spring est liée !! (Comment la valeur du délai d'expiration de la transaction Spring est-elle utilisée?)](Http: // qiita. com / kazuki43zoo / items / 1ac208a49c1d6ceeb0b8 # printemps% E3% 81% AE% E3% 83% 88% E3% 83% A9% E3% 83% B3% E3% 82% B6% E3% 82% AF% E3% 82% B7% E3% 83% A7% E3% 83% B3% E3% 82% BF% E3% 82% A4% E3% 83% A0% E3% 82% A2% E3% 82% A6% E3% 83% 88% E5% 80% A4% E3% 81% A3% E3% 81% A6% E3% 81% A9% E3% 81% 86% E4% BD% BF% E3% 82% 8F% E3% 82% 8C% E3% Pour la nécessité de "82% 8B% E3% 81% AE% E3% 81% 8B)" et "indicateur pour savoir s'il faut effectuer un traitement de restauration lorsqu'une erreur se produit au moment de la validation", "Spring's DataSourceTransactionManager Si vous l'utilisez, il peut être commis en cas d'erreur!? ".
Si vous souhaitez partager votre logique de personnalisation avec plusieurs applications, c'est une bonne idée de créer et de personnaliser une classe d'implémentation pour PlatformTransactionManagerCustomizer
. (Imaginez un cas où il est fourni comme une bibliothèque commune)
@Component
public class MyPlatformTransactionManagerCustomizer
implements PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> {
@Override
public void customize(AbstractPlatformTransactionManager transactionManager) {
// ...Mettre en œuvre une logique de personnalisation
}
}
Note:
La méthode
personnaliser
est appelée uniquement lorsque lePlatformTransactionManager
généré par Spring Boot peut être affecté au type spécifié dans les génériques dePlatformTransactionManagerCustomizer
.
Pour la personnalisation spécifique à une application, vous pouvez également implémenter ad hoc la méthode personnaliser
de PlatformTransactionManagerCustomizer
à l'aide d'expressions Lambda prises en charge par Java SE 8 sans créer de classe comme celle ci-dessus.
@Bean
PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> transactionManagerCustomizer() {
return transactionManager -> {
// ...Mettre en œuvre une logique de personnalisation
};
}
~~Warning:~~
~~ Lors de l'utilisation de l'expression Lambda ... Le contrôle d'appel de la méthode
personnaliser
par le type spécifié dans les génériques dePlatformTransactionManagerCustomizer
ne fonctionne pas (= On considère quePlatformTransactionManager
est spécifié dans les génériques ". ...). ~~ ~~ Par conséquent, si lePlatformTransactionManager
généré par Spring Boot ne peut pas être affecté au type spécifié dans les génériques ...CalssCastException
se produira, alors soyez prudent! !! ~~** 30/12 15:40 ajouté **
Si une
ClassCastException
se produit, elle sera ignorée, elle se comportera donc de la même manière que lors de la création de la classe! !! !!
Plusieurs PlatformTransactionManagerCustomizer
s peuvent être appliqués, y compris l'implémentation intégrée de Spring Boot ( TransactionProperties
). Le comportement lorsque plusieurs PlatformTransactionManagerCustomizer
s sont enregistrés dans le conteneur DI n'est pas défini par défaut. Si vous souhaitez contrôler la commande ...
@ org.springframework.core.annotation.Order
Cela peut être réalisé en faisant cela, mais il semble que cela ne puisse pas être fait après l'implémentation intégrée de Spring Boot (TransactionProperties
). (Au moins ... je ne pouvais pas le faire après l'implémentation intégrée dans mon environnement, mais je ne pense pas que ce soit un problème.)
Bien qu'il n'ait pas encore été publié, à partir de Spring Boot 1.5, une interface (PlatformTransactionManagerCustomizer
) qui prend en charge la personnalisation de PlatformTransactionManager
a été ajoutée ~
Cela signifie ...
Les propriétés suivantes, qui sont susceptibles d'être personnalisées fréquemment, peuvent maintenant être personnalisées avec ʻapplication.properties (ou ʻapplication.yml
) ~
Je l'ai présenté.
Spring Boot 1.5 devrait sortir en RC1 au début de l'année et la version officielle à la fin du mois de janvier. Lorsque RC1 sort, vérifions les changements de Spring Boot 1.4 (je pense).
Je pense que cette entrée est probablement la fin de la Qiita de cette année. Je pense poster comme j'aime l'année prochaine, alors j'espère que cela aidera un peu tout le monde. (Veuillez commenter s'il y a quelque chose d'étrange ou si vous voulez faire plus comme ça !!)
Eh bien, il ne reste plus que deux jours cette année ... Bonne année ~: see_no_evil :: hear_no_evil :: speak_no_evil:
Recommended Posts