[JAVA] Customizer pour Platform Transaction Manager ajouté à partir de Spring Boot 1.5

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?

Jusqu'à Spring Boot 1.4, si vous vouliez personnaliser le PlatformTransactionManager, vous deviez effectuer l'une des opérations suivantes:

@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
	DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
	transactionManager.setDefaultTimeout(30);
	transactionManager.setRollbackOnCommitFailure(true);
	// ...
	return transactionManager;
}
@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);
	// ...
}

De Spring Boot 1.5 (sortie prévue fin janvier)?

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.

Implémentation intégrée de PlatformTransactionManagerCustomizer

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!? ".

Comment créer et personnaliser une classe d'implémentation pour PlatformTransactionManagerCustomizer

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 le PlatformTransactionManager généré par Spring Boot peut être affecté au type spécifié dans les génériques de PlatformTransactionManagerCustomizer.

Comment personnaliser à l'aide d'expressions Lambda (Java SE 8+)

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 de PlatformTransactionManagerCustomizer ne fonctionne pas (= On considère que PlatformTransactionManager est spécifié dans les génériques ". ...). ~~ ~~ Par conséquent, si le PlatformTransactionManager 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! !! !!

Ordre des applications de PlatformTransactionManagerCustomizer

Plusieurs PlatformTransactionManagerCustomizers peuvent être appliqués, y compris l'implémentation intégrée de Spring Boot ( TransactionProperties). Le comportement lorsque plusieurs PlatformTransactionManagerCustomizers sont enregistrés dans le conteneur DI n'est pas défini par défaut. Si vous souhaitez contrôler la commande ...

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.)

Résumé

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).

à la fin

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

Customizer pour Platform Transaction Manager ajouté à partir de Spring Boot 1.5
Essayez Spring Boot de 0 à 100.
Spring Boot pour l'apprentissage des annotations
Spring Boot pour la première fois
Annotations fréquentes pour les tests Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
Utiliser DBUnit pour le test Spring Boot
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Spring Boot à partir de zéro Partie 2
Spring Boot à partir de zéro Partie 1
L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Introduction du livre: Spring Boot Livre de référence recommandé pour les débutants!
Remarques sur les annotations lors de l'écriture de tests pour Spring Boot
◆ Obtenez l'API créée par Spring Boot à partir de React
De la création d'un environnement cloud AWS au déploiement d'une application Spring Boot (pour les débutants)