Bei Verwendung von Spring Boot wird automatisch die Bean-Definition der Implementierungsklasse der Schnittstelle "PlatformTransactionManager" ("DataSourceTransactionManager", "JpaTransactionManager", "JtaTransactionManager" usw.) entsprechend der Verwendungstechnologie ausgeführt. Kann es als Standard verwendet werden? Es ist ein bisschen subtil und ich denke, es gibt einige Parameter, die angepasst werden sollten. Das war's ... Dieses Mal werde ich vorstellen, wie man "PlatformTransactionManager" auf Spring Boot anpasst.
Wenn Sie bis zum Spring Boot 1.4 den PlatformTransactionManager anpassen wollten, mussten Sie einen der folgenden Schritte ausführen:
@Bean
PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
return transactionManager;
}
@Autowired
void configureTransactionManager(AbstractPlatformTransactionManager transactionManager) { //Von Spring Boot automatisch gesetzte Bohnen werden injiziert und angepasst
transactionManager.setDefaultTimeout(30);
transactionManager.setRollbackOnCommitFailure(true);
// ...
}
Zusätzlich zu der oben beschriebenen Methode können Sie ab Spring Boot 1.5 Anpassungen vornehmen, indem Sie die Bean der Implementierungsklasse "org.springframework.boot.autoconfigure.transaction.PlatformTransactionManagerCustomizer" im DI-Container registrieren.
Auszug aus PlatformTransactionManagerCustomizer
public interface PlatformTransactionManagerCustomizer<T extends PlatformTransactionManager> {
void customize(T transactionManager);
}
Ich denke, dieser Mechanismus ist nützlich, wenn Sie die Anpassungslogik für mehrere Anwendungen freigeben möchten.
Eigentlich ... Spring Boot bietet eine integrierte Klasse, die die Schnittstelle "PlatformTransactionManagerCustomizer" implementiert. Mit der von Spring Boot bereitgestellten integrierten Implementierung können Sie die Werte der folgenden Eigenschaften anpassen, die in "AbstractPlatformTransactionManager" definiert sind. (gh-7561)
src/main/resources/application.properties
spring.transaction.default-timeout=30
spring.transaction.rollback-on-commit-failure=true
Note:
In Bezug auf die Behandlung des Spring-Transaktions-Timeout-Werts ist "[MyBatis-Spring 1.3 mit dem Spring-Transaktions-Timeout-Wert verknüpft !! (Wie wird das Spring-Transaktions-Timeout-Wert verwendet?)](Http: // qiita. com / kazuki43zoo / items / 1ac208a49c1d6ceeb0b8 # spring% 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% Für die Notwendigkeit von "82% 8B% E3% 81% AE% E3% 81% 8B)" und "Flag für die Durchführung der Rollback-Verarbeitung, wenn zum Festschreibungszeitpunkt ein Fehler auftritt", DataSourceTransactionManager von Spring Wenn Sie es verwenden, kann es im Fehlerfall festgeschrieben werden !? ".
Wenn Sie Ihre Anpassungslogik für mehrere Anwendungen freigeben möchten, empfiehlt es sich, eine Implementierungsklasse für "PlatformTransactionManagerCustomizer" zu erstellen und anzupassen. (Stellen Sie sich einen Fall vor, in dem es wie eine gemeinsame Bibliothek bereitgestellt wird.)
@Component
public class MyPlatformTransactionManagerCustomizer
implements PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> {
@Override
public void customize(AbstractPlatformTransactionManager transactionManager) {
// ...Implementieren Sie die Anpassungslogik
}
}
Note:
Die Methode "Anpassen" wird nur aufgerufen, wenn der von Spring Boot generierte "PlatformTransactionManager" dem in den Generika des "PlatformTransactionManagerCustomizer" angegebenen Typ zugewiesen werden kann.
Für die anwendungsspezifische Anpassung können Sie auch die Methode "anpassen" von "PlatformTransactionManagerCustomizer" mithilfe von Lambda-Ausdrücken, die von Java SE 8 unterstützt werden, ad hoc implementieren, ohne eine Klasse wie die oben beschriebene zu erstellen.
@Bean
PlatformTransactionManagerCustomizer<AbstractPlatformTransactionManager> transactionManagerCustomizer() {
return transactionManager -> {
// ...Implementieren Sie die Anpassungslogik
};
}
~~Warning:~~
~~ Bei Verwendung des Lambda-Ausdrucks ... Die Aufrufsteuerung der Methode "customize" nach dem in den Generika von "PlatformTransactionManagerCustomizer" angegebenen Typ funktioniert nicht (= Es wird davon ausgegangen, dass "PlatformTransactionManager" in den Generika angegeben ist ...). ~~ ~~ Wenn der von Spring Boot generierte
PlatformTransactionManager
nicht dem in den Generika angegebenen Typ zugewiesen werden kann ...CalssCastException
wird auftreten, seien Sie also vorsichtig! !! ~~** 30.12.15:40 hinzugefügt **
Wenn eine "ClassCastException" auftritt, wird sie ignoriert, sodass sie sich genauso verhält wie beim Erstellen der Klasse! !! !!
Es können mehrere PlatformTransactionManagerCustomizer angewendet werden, einschließlich der integrierten Implementierung von Spring Boot (TransactionProperties). Das Verhalten, wenn mehrere PlatformTransactionManagerCustomizer im DI-Container registriert sind, ist standardmäßig nicht definiert. Wenn Sie die Bestellung kontrollieren möchten ...
@ org.springframework.core.annotation.Order
Dies kann auf diese Weise erreicht werden, aber es scheint, dass dies nach der integrierten Implementierung von Spring Boot (TransactionProperties
) nicht möglich ist. (Zumindest ... konnte ich es nach der integrierten Implementierung in meiner Umgebung nicht tun, aber ich denke nicht, dass es ein Problem ist.)
Obwohl es noch nicht veröffentlicht wurde, wurde ab Spring Boot 1.5 eine Schnittstelle (PlatformTransactionManagerCustomizer
) hinzugefügt, die das Anpassen von PlatformTransactionManager
unterstützt ~
Das bedeutet ...
Die folgenden Eigenschaften, die wahrscheinlich häufig angepasst werden, können jetzt mit application.properties
(oder application.yml
) ~ angepasst werden
Das habe ich vorgestellt.
Spring Boot 1.5 soll Anfang des Jahres in RC1 und Ende Januar in der offiziellen Version veröffentlicht werden. Wenn RC1 herauskommt, überprüfen wir die Änderungen von Spring Boot 1.4 (glaube ich).
Ich denke, dieser Eintrag ist wahrscheinlich das Ende der diesjährigen Qiita. Ich denke darüber nach, nächstes Jahr zu posten, wie ich es mag, also hoffe ich, dass es allen ein wenig hilft. (Bitte kommentieren Sie, wenn es etwas Seltsames gibt oder wenn Sie mehr davon machen möchten !!)
Nun, dieses Jahr sind nur noch zwei Tage übrig ... Hab ein schönes Jahr ~: see_no_evil :: hear_no_evil :: speak_no_evil:
Recommended Posts