一尘不染

Spring ApplicationContext-资源泄漏:“context”从未关闭

spring

在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应用程序,因此在运行该应用程序时,我无法真正关闭/销毁上下文,因为我引用该服务。警告到底想告诉我什么?


阅读 600

收藏
2020-04-19

共1个答案

一尘不染

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

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

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

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

2020-04-19