Spring ApplicationContext-资源泄漏:“上下文”从未关闭


问题内容

在spring MVC应用程序中,我使用以下方法在服务类之一中初始化变量:

ApplicationContext context = 
         new ClassPathXmlApplicationContext("META-INF/userLibrary.xml");
service = context.getBean(UserLibrary.class);

UserLibrary是我在应用程序中使用的第三方工具。上面的代码为’context’变量生成警告。该警告如下所示:

Resource leak: 'context' is never closed

我不明白警告。由于该应用程序是Spring MVC应用程序,因此在运行该应用程序时,我无法真正关闭/销毁该上下文,因为我引用该服务。警告到底想告诉我什么?


问题答案:

由于应用程序上下文是一个ResourceLoader(即I
/
O操作),因此它消耗了某些时候需要释放的资源。这也是一个扩展AbstractApplicationContext,它实现Closable。因此,它有一种close()方法,可以在try-
with-
resources语句中使用


try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/userLibrary.xml")) {
  service = context.getBean(UserLibrary.class);
}

是否真的需要创建此上下文是一个不同的问题(您已链接到它),我不会对此发表评论。

确实,在停止应用程序时隐式关闭了上下文,但这还不够好。Eclipse是正确的,您需要采取措施在其他情况下手动将其关闭,以避免类加载器泄漏。