java / expert
Snippet
Lösung der @Transactional-Selbstaufrufe mit ObjectProvider
Springs @Transactional basiert auf AOP-Proxies. Der direkte Aufruf einer transaktionalen Methode innerhalb derselben Klasse umgeht den Proxy. Die Nutzung von ObjectProvider zur Selbst-Injektion stellt sicher, dass der Aufruf über den Proxy erfolgt.
snippet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Servicepublic class OrderService {private final ObjectProvider<OrderService> self;public OrderService(ObjectProvider<OrderService> self) {this.self = self;}public void processOrder() {// Self-invocation via proxy to ensure @Transactional is honoredself.getIfAvailable().saveToDatabase();}@Transactionalpublic void saveToDatabase() {// Database logic here}}
spring
Erklärung
1
ObjectProvider<OrderService> self
Stellt eine verzögert geladene Referenz auf die Proxy-Version des aktuellen Beans bereit.
2
self.getIfAvailable().saveToDatabase()
Ruft die Methode auf dem Proxy auf, wodurch der Transaktions-Interceptor aktiviert wird.