java / intermediate
Snippet
Isolierung von anfragespezifischem Zustand mit Scoped Proxy Target Classes in benutzerdefinierten Kontext-Holdern
In mandantenfähigen Architekturen kann die Injektion anfragespezifischer Metadaten in Singleton-Beans zu Race Conditions und Datenübertragungsfehlern zwischen Threads führen. Durch die Verwendung von `@RequestScope` mit `ScopedProxyMode.TARGET_CLASS` injiziert Spring einen dynamischen CGLIB-Proxy in Singleton-Beans, der die Mandantendaten zur Laufzeit verzögert aus dem Lebenszyklus der aktuellen HTTP-Anfrage auflöst.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Component@RequestScope(proxyMode = ScopedProxyMode.TARGET_CLASS)public class TenantContextHolder {private String tenantId;private String correlationId;public void initialize(String tenantId, String correlationId) {this.tenantId = tenantId;this.correlationId = correlationId;}public String getTenantId() {return this.tenantId;}public String getCorrelationId() {return this.correlationId;}}
spring
Erklärung
1
@RequestScope(proxyMode = ScopedProxyMode.TARGET_CLASS)
Beschränkt den Lebenszyklus der Bean auf eine HTTP-Anfrage und erstellt einen CGLIB-Proxy zur sicheren Injektion in Singleton-Beans.
2
public void initialize(String tenantId, String correlationId) {
Befüllt die Mandanten- und Korrelationsdaten, meist frühzeitig durch einen Interceptor oder Filter aufgerufen.
3
public String getTenantId() {
Greift dynamisch auf die Mandanten-ID zu, die für den aktuell ausführenden Anfrage-Thread aufgelöst wird.