[英]Spring RequestScope bean not working as expected
我正在嘗試了解有關在項目中使用的 Spring bean 范圍的更多信息。 我創建了一些測試類,但沒有得到我期望的行為。
我創建了以下組件,我希望這個 bean 只在 HTTP 請求的持續時間內持續。
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDataContainer {
public int requestCount = 0;
}
以下控制器使用該組件。
@Controller
@RequestMapping("/hello")
public class HelloController {
@Autowired
private UserDataContainer userData;
@GetMapping
public String get(Model model) {
model.addAttribute("prev", userData.requestCount);
userData.requestCount++;
model.addAttribute("curr", userData.requestCount);
return "test";
}
}
我的問題是,似乎沒有為每個請求創建一個新的 UserDataContainer 實例。 每當我加載此頁面時,我都會看到“prev”和“curr”的值不斷增加,而不是在每個請求開始時重置為 0。 我是否誤解了這應該如何工作,或者沒有正確實施。
這里的問題是請求范圍的 bean 不是由您的控制器直接調用的。
相反,控制器使用代理來調用請求范圍的 bean(在這種情況下,代理是一個基於您的代理模式注釋的 cglib,即: ScopedProxyMode.TARGET_CLASS
代理只包裝請求范圍 bean 的方法,而不是它的變量。
簡而言之,將請求作用域 bean 的實例變量封裝到一個方法中,然后從 Controller 調用該方法。
像這樣:
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDataContainer {
private int requestCount = 0;
public int incrementRequestCount(){
requestCount++;
return requestCount;
}
public int getRequestCount(){
return requestCount;
}
}
然后在您的控制器中,只需調用公共方法
@GetMapping
public String get(Model model) {
model.addAttribute("prev", userData.getRequestCount());
model.addAttribute("curr", userData.incrementRequestCount());
return "test";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.