0 Tage Serie
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.