2013-11-27 34 views
0

我有一个应用程序作用域静态资源,我将在ServletContext初始化时初始化它。发布Java Web应用程序作用域静态资源

这里是我的代码:

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) { ... } 
    } 

静态资源会被打包成一个MyJar.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类是非常简单,只包含了类型类的一些特性,原语,法,...

我的问题是在contextDestroyed功能,我必须设置为NULL StaticResource.staticMap?

至于我的理解,当静态资源类卸载(在contextDestroyed执行后),所以设置为NULL staticMap不需要staticMap将被销毁。

回答

1

你不应该,除非你的Java代码在一个罐子里这是对你的应用服务器库捆绑在一起。

当取消部署应用程序时,应用程序服务器将丢弃分配给您的Web应用程序的ClassLoader。但是,如果您的代码位于服务器库目录中,则它将由应用程序服务器ClassLoader加载,因此它不会被垃圾收集。

相关问题