[英]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
是像Components
或Services
這樣的 bean。 因此,在所有這些中,您應該以相同的方式處理注入的依賴項。
來到您添加的示例,bean 不應該是實際端點映射的參數。 請求特定於請求的信息,如標頭、路徑變量或有效負載主體是端點映射方法 arguments 的候選者。
對於 class MyBean
的 bean 實例,您應該使用直接或通過MyController
的構造函數注入的成員變量(推薦使用基於構造函數的注入方法)。
在MyController
的構造函數中注入RequestScoped
的MyBean
時不要感到困惑:這完全是有意的並且有效。 Spring 實際上注入了一個代理實例,一旦您的請求到達 controller 調用,該實例將解析為請求特定的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.