簡體   English   中英

是否能夠使用 Spring 中的構造函數注入將 RequestScope bean 注入 Singleton bean?

[英]Is it able to inject RequestScope bean into Singleton bean using Constructor Injection in Spring?

據我測試,它正在工作。 但我不明白它為什么以及如何工作。(我也不確定在生產中使用它是否安全)

這是我的測試代碼

@Service
public class SomeService {

    private static final Logger logger = LoggerFactory.getLogger(SomeService.class);

    private final RequestContext requestContext; // @RequestScope + @Component Bean
    public SomeService(RequestContext requestContext) {
        this.requestContext = requestContext;
    }

    public void checkBean() {
        logger.info("Singleton Bean: {}, RequestScope Bean: {}", this, this.requestContext);
        String clientId = recommendContext.getClientId();
    }
}

像下面這樣的場景

  • 從 Controller 獲取請求
  • SomeService由 Controller 注入
  • 每個請求都有自己的RequestContext Bean
  • 在 Controller 中,調用someService.checkBean()

我認為奇怪的一點是

  • SomeService是一個 singleton bean
  • RequestContext被聲明為final變量,僅由構造函數發起
  • 但是,它似乎有效。

運行代碼的結果如下所示

2021-06-14 09:56:26.010 INFO  23075 --- [nio-8888-exec-1] p.service.SomeService   : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56867592
2021-06-14 09:56:30.933 INFO  23075 --- [nio-8888-exec-3] p.service.SomeService   : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@73ddb7a4
2021-06-14 09:56:31.687 INFO  23075 --- [nio-8888-exec-4] p.service.SomeService   : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56b4f7c8
2021-06-14 09:56:32.352 INFO  23075 --- [nio-8888-exec-5] p.service.SomeService   : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@33469287

如您所見,Service 是 Single 並且 RequestContext bean 對於每個請求都是唯一的。 我需要一些關於 spring 內部發生的事情的解釋

謝謝

當 bean 是請求范圍的時,Spring 創建一個代理。 每當調用此代理時,它都會委托給特定於當前請求的 bean 實例。

在您的情況下,注入SomeService並存儲在requestContext final變量中的RequestContext實例是代理。 如果您嘗試在 web 請求的 scope 之外調用服務,它將失敗,因為代理無法找到當前請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM