当前位置: 首页 > 知识库问答 >
问题:

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

伏德义
2023-03-14

在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应用程序,当我在应用程序运行时引用服务时,我不能真正关闭/破坏上下文。警告到底想告诉我什么?

共有3个答案

姬乐
2023-03-14

一个简单的演员阵容解决了这个问题:

((ClassPathXmlApplicationContext) fac).close();
索嘉石
2023-03-14

ApplicationContext界面中未定义close()。

安全解除警告的唯一方法是

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(...);
try {
    [...]
} finally {
    ctx.close();
}

或者,在Java7

try(ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(...)) {
    [...]
}

基本区别在于,由于您显式地实例化了上下文(即通过使用new),因此您知道要实例化的类,因此可以相应地定义变量。

如果您没有实例化AppContext(即使用Spring提供的一个),则无法关闭它。

广晔
2023-03-14

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

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

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

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

 类似资料:
  • 为什么Eclipse在下面的代码中给了我变暖的“资源泄漏:'in'从不关闭”?

  • 此代码导致资源泄漏: conin从未关闭 为什么会发生这种情况?我如何修复它?

  • 我正在使用Eclipse,并执行下面的函数,碰巧我打开了一个扫描器,然后,最后我关闭了它,但Eclipse一直说它没有关闭“资源泄漏:'Scanner'没有关闭”。我可以用try with resources来完成,警告消失了,但我想知道为什么我在这里尝试的方式不起作用

  • 当我创建扫描仪时,似乎出现了这个错误。我试图通过搜索错误名称来解决这个问题,但到目前为止未能成功地让消息停止出现。 代码: 我得到错误的部分:

  • 问题内容: 在spring MVC应用程序中,我使用以下方法在服务类之一中初始化变量: UserLibrary是我在应用程序中使用的第三方工具。上面的代码为’context’变量生成警告。该警告如下所示: 我不明白警告。由于该应用程序是Spring MVC应用程序,因此在运行该应用程序时,我无法真正关闭/销毁上下文,因为我引用该服务。警告到底想告诉我什么? 问题答案: 由于应用程序上下文是一个(i

  • 我正在编写一个程序,希望控制台输出用户输入的数字的剩余部分。但是,每次我编译代码时,控制台都会打印出来,我得到以下控制台错误: 我不确定控制台所说的“资源泄漏”是什么意思。我在几个不同的地方查找过它(包括API和其他堆栈溢出问题),我不确定为什么没有打印到控制台。我正在使用DrJava程序,以防有人想知道。 这里是我的代码供参考: