簡體   English   中英

Spring 引導請求范圍 Bean 自動裝配未填充

[英]Spring Boot Request Scoped Beans Autowired not Populated

我是 Spring Boot 的新手,我只喜歡使用它的依賴注入,而不是所有自以為是的框架,而是一些。 我知道此功能還有其他替代方案,但我想了解更多 Spring。

我正在嘗試擁有一個請求范圍的 bean 並使用常規依賴注入填充它。 我的計划是讓一些我可以填充的用戶 object 包含一些易於訪問的自定義業務詳細信息,從而使代碼變得干凈。

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
class MyBean {
  @Autowired
  lateinit var req: HttpServletRequest

  @Autowired
  lateinit var env: Environment

  @PostConstruct
  fun pc() {
    println("I am constructed $this, $req, $env")
  }

  var a = 3
}


@RestController
class MyController {
    @GetMapping("/api/xyz")
    fun login(m: MyBean): Int {
        println("new bean m")
        return m.a
    }
}

每次我到達那個端點時,我都會看到新對象被實例化。 但是,內部依賴項不是自動裝配的,它們始終是 null。 我究竟做錯了什么? 我需要寫一個過濾器嗎? 但是我怎么知道如何找到需要初始化該 bean 的所有端點呢? 如果,我刪除請求 scope 變量被初始化。

RestControllers是像ComponentsServices這樣的 bean。 因此,在所有這些中,您應該以相同的方式處理注入的依賴項。

來到您添加的示例,bean 不應該是實際端點映射的參數。 請求特定於請求的信息,如標頭、路徑變量或有效負載主體是端點映射方法 arguments 的候選者。

對於 class MyBean的 bean 實例,您應該使用直接或通過MyController的構造函數注入的成員變量(推薦使用基於構造函數的注入方法)。

MyController的構造函數中注入RequestScopedMyBean時不要感到困惑:這完全是有意的並且有效。 Spring 實際上注入了一個代理實例,一旦您的請求到達 controller 調用,該實例將解析為請求特定的實例。

暫無
暫無

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

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