簡體   English   中英

Spring RequestScope bean 未按預期工作

[英]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.

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