applicationServlet 实际上是如何管理上下文变量的?如果我在应用程序上下文级别设置变量,无论它存储在方法区域还是堆栈区域或堆中,如果是这样,它如何存储以及如何访问?
在这里,我创建了局部变量作为 MAP,并将一些值放在应用程序上下文级别。
我在下面写了一些示例代码。
public class ContextLoaderListener implements ServletContextListener {
private ServletContext ctx;
private WebApplicationContext springContext;
@Override
public void contextInitialized(ServletContextEvent sce) {
Map<String, String> resourceMap=new HashMap<>();
resourceMap.put("1","abc1");
resourceMap.put("2","abc2");
resourceMap.put("3","abc3");
sce.getServletContext().setAttribute("resourceMap", resourceMap);
}
@Override
public void contextDestroyed(ServletContextEvent sce) { }
}
我将在这里回答您的评论,我认为它也回答了您的问题。
您在评论中的问题如下:
资源映射是这种部分方法的本地映射。 完成后 此方法的执行 资源映射局部变量将 摧毁。如果是这样,那么资源映射上下文变量如何引用本地 变量资源映射 ?
井资源图只是一个本地参考。堆中的对象本身。你是对的,资源映射在方法执行完成后丢失。但是,您将引用的副本传递给另一个寿命更长的对象。请参阅以下示例:
class TestClass {
public static void main(String[] args) {
final ServletContext servletContext = new ServletContext();
final ServletContextEvent servletContextEvent = new ServletContextEvent(servletContext);
final ServletContextListener servletContextListener = new ServletContextListener();
servletContextListener.contextInitialized(servletContextEvent);
final Object resourceMap = servletContext.getMap().get("resourceMap");
// See, resourceMap is still accesiable. Because it still has an alive reference to it from ServletContext!
System.out.println(resourceMap);
// Output will be:
// {1=abc1}
}
}
class ServletContext {
final Map<String, Object> map = new HashMap<String, Object>();
public void setAttribute(String resourceMap, Map<String, String> value) {
this.map.put(resourceMap, value);
}
public Map<String, Object> getMap() {
return map;
}
}
class ServletContextEvent {
private final ServletContext servletContext;
public ServletContextEvent(ServletContext servletContext) {
this.servletContext = servletContext;
}
public ServletContext getServletContext() {
return servletContext;
}
}
class ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Map<String, String> resourceMap = new HashMap<String, String>();
resourceMap.put("1", "abc1");
sce.getServletContext().setAttribute("resourceMap", resourceMap);
}
}
这回答了你的问题吗?