SpringRequestScope bean未按预期工作

fumotvh3  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(292)

我试图了解更多关于Springbean作用域的信息,以便在项目中使用。我已经创建了一些测试类,但我没有得到预期的行为。
我创建了以下组件,我希望这个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。我是否误解了这应该是如何工作的,或者某件事情没有正确实施。

ecfsfe2w

ecfsfe2w1#

这里的问题是,您的控制器没有直接调用请求范围的bean。
相反,控制器使用代理来调用请求范围的bean(在本例中,代理是基于代理模式注解的cglib,即: ScopedProxyMode.TARGET_CLASS 代理只 Package 请求范围bean的方法,而不是它的变量。
简而言之,将请求范围bean的示例变量封装到一个方法中,并从控制器调用该方法。
大概是这样的:

@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";
}

相关问题