我试图了解更多关于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。我是否误解了这应该是如何工作的,或者某件事情没有正确实施。
1条答案
按热度按时间ecfsfe2w1#
这里的问题是,您的控制器没有直接调用请求范围的bean。
相反,控制器使用代理来调用请求范围的bean(在本例中,代理是基于代理模式注解的cglib,即:
ScopedProxyMode.TARGET_CLASS
代理只 Package 请求范围bean的方法,而不是它的变量。简而言之,将请求范围bean的示例变量封装到一个方法中,并从控制器调用该方法。
大概是这样的:
然后在控制器中,只需调用公共方法