在Spring文档中,有关于“application”范围的声明。
申请范围
考虑以下bean定义:
Spring容器通过对整个Web应用程序使用appPreferences bean定义一次来创建AppPreferences bean的新实例。也就是说,appPreferences bean的作用域是ServletContext级别,存储为常规的ServletContext属性。这有点类似于Spring单例bean,但在两个重要方面有所不同:它是每个ServletContext的单例,而不是每个Spring ApplicationContext(或者在任何给定的Web应用程序中可能有几个),而它实际上是暴露的,因此可以看作是ServletContext属性。
正如我测试的那样,这是不正确的。
以下是测试代码:
<bean id="applicationA" class="demo.A" scope="application"/>
@RequestMapping("/testApplicationScope")
@ResponseBody
public String testRequestScope(HttpServletRequest request) {
ServletContext ctx = request.getServletContext();
System.out.println(ctx.getAttribute("applicationA"));
// even try to traverse all ServletContext's attributes, but nothing found
for (Enumeration<String> e = ctx.getAttributeNames(); e.hasMoreElements();) {
Object obj = ctx.getAttribute(e.nextElement());
if (obj instanceof A) {
A a = (A) obj;
System.out.println(a);
}
}
return "Tested";
}
你可以尝试测试一下吗?有点混乱。