有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring Bean工厂装卸

  1. Spring何时可以优雅地卸载Spring容器(XMLBeanFactory)
  2. 当应用程序正在运行,但BeanFactory的唯一处理程序超出范围时会发生什么
  3. 装载弹簧容器的理想方式是什么?做handler = new BeanFactory()是正确的方法吗


更新:
当容器超出范围时,我们确实希望调用close()方法,从而释放所有保留的资源。但事实并非如此!我遇到了这样一个例子:我的spring容器超出了作用域,但内存仍然很满(OutOfMemory错误)。原因是我的Spring容器创建的SessionFactory对象从未被垃圾收集,因为它们是静态创建的。这意味着当容器超出范围时close()->destroy()从未被调用。让我相信弹簧本身存在泄漏问题


共 (1) 个答案

  1. # 1 楼答案

    1. 这取决于你如何实例化它。对于一个webapp,这通常是在上下文关闭时完成的。在命令行上,您必须专门关闭上下文(通过“AbstractApplicationContext”上的“close”方法)
    2. 与其他超出范围的内容相同。不确定“close”方法是否属于终结器阶段。我希望终结器能触发毁灭阶段
    3. 正如其他人所说,不要直接使用BeanFactory。创建应用程序上下文。web应用程序最常用的方式是ContextLoaderListener,命令行程序最常用的方式是ClassPathXmlApplicationContext

    // Keep a specific type, so we can call the "close" method later since it's // not part of the ApplicationContext interface itself. ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] { "applicationContext.xml });

    然后你再关上它:

    context.close();
    

    对于网络应用:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>