我有一个应用程序范围的静态资源,我将在ServletContext初始化时初始化它。
这是我的代码:
public class StaticResource {
private static Map<Class, MyBean> staticMap = new HashMap<>();
public static void add(Class clazz, MyBean b) { ... }
public static MyBean get(Class clazz) { ... }
}
StaticResource将打包到MyJar.jar中,并将此jar放入myWebApp / WEB-INF / lib中。我添加此信息是为了让我们知道StaticResource仅适用于我的应用程序(未共享)
我初始化的代码如下:
@WebListener
public class AppListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
StaticResource.put ( Bean1.class, myBean_instance1);
StaticResource.put ( Bean2.class, myBean_instance2);
// ...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// --- Do I need to set NULL to StaticResource.staticMap?
}
MyBean类非常简单,只包含一些类型为Class,Primitives,Method的属性......
MY QUESTION在contextDestroyed函数中,我是否必须将NULL设置为StaticResource.staticMap?
根据我的理解,当StaticResource类被卸载时(在执行了contextDestroyed之后),staticMap将被销毁,因此不需要为staticMap设置NULL。
答案 0 :(得分:1)
除非您的Java代码捆绑在应用程序服务器库中的jar中,否则您不应该这样做。
取消部署应用程序时,您的应用程序服务器将丢弃分配给您的webapp的ClassLoader
。但是,如果您的代码位于服务器libs目录中,那么它将由应用程序服务器ClassLoader
加载,因此不会被垃圾回收。