发布Java Web应用程序作用域静态资源

时间:2013-11-27 17:53:11

标签: java garbage-collection

我有一个应用程序范围的静态资源,我将在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函数中,我是否必须将N​​ULL设置为StaticResource.staticMap?

根据我的理解,当StaticResource类被卸载时(在执行了contextDestroyed之后),staticMap将被销毁,因此不需要为staticMap设置NULL。

1 个答案:

答案 0 :(得分:1)

除非您的Java代码捆绑在应用程序服务器库中的jar中,否则您不应该这样做。

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