在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.e. I/O operations),因此它消耗了某些时候需要释放的资源。这也是一个扩展AbstractApplicationContext,它实现Closable。因此,它有一个close()方法,可以在try-with-resources语句中使用。
ResourceLoader
AbstractApplicationContext
close()
try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/userLibrary.xml")) { service = context.getBean(UserLibrary.class); }
是否真的需要创建此上下文是一个不同的问题(已链接至该问题),我不会对此发表评论。
的确,在停止应用程序时隐式关闭了上下文,但这还不够好。Eclipse是正确的,你需要采取措施在其他情况下手动将其关闭,以避免类加载器泄漏。