問題:Controller、Service、DAO 三層需共享同一 `Map` 實例(如請求級緩存、上下文傳遞)。
// ❌ 線程不安全,併發請求數據互相覆蓋
public class GlobalContext {
public static Map sharedMap = new HashMap<>();
}
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestContext {
private final Map data = new ConcurrentHashMap<>();
public void put(String key, Object val) { data.put(key, val); }
public Object get(String key) { return data.get(key); }
}
// 注入到三層
@Service public class UserService {
@Autowired RequestContext ctx; // 每個 HTTP 請求獲得同一實例
}
@Repository public class UserDao {
@Autowired RequestContext ctx;
}
public final class RequestHolder {
private static final ThreadLocal
// 依賴 com.alibaba:transmittable-thread-local
private static final TransmittableThreadLocal
| 場景 | 推薦方案 |
|---|---|
| 純 Spring MVC/WebFlux 請求級共享 | @Scope(REQUEST) + ScopedProxy |
| 非 Web / 多框架混合 / 高性能要求 | ThreadLocal + Filter 清理 |
| 大量異步/線程池任務需繼承上下文 | TransmittableThreadLocal |
| 分布式追蹤 | SkyWalking / Zipkin 自動埋點,勿手工實現 |