0

我使用 Springframework 的 ClassPathXMLApplicationContext 来初始化一些 bean,如下所示:

ctx = new ClassPathXMLApplicationContext(filename);

我呼吁ctx.close()应用程序退出。

但是,有时 ctx 本身的创建会产生异常(由于某些 bean 创建中的错误),因此我没有得到 ctx 对象。但是某些 bean 可能在此异常之前已成功初始化。

我的问题是,在这种情况下,我该如何做类似的ctx.close()事情来清理可能已经初始化的 bean?

4

1 回答 1

0

如果您使用的是 Java 7 或更高版本,那么您可以在 try with resources 中声明您的上下文初始化,这样您就不需要手动关闭上下文:

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(filename))
{
     //write your code
} catch(Exception e){}

此外,在非 Web 应用程序环境中,您向 JVM 注册了一个关闭挂钩。这样做可确保正常关闭并在单例 bean 上调用相关的销毁方法,以便释放所有资源。当然,您仍然必须正确配置和实现这些销毁回调。

要注册关闭钩子,请调用在 AbstractApplicationContext 类上声明的 registerShutdownHook() 方法:

public static void main(final String[] args) throws Exception {
  AbstractApplicationContext ctx
      = new ClassPathXmlApplicationContext(new String []{"beans.xml"});

  // add a shutdown hook for the above context... 
  ctx.registerShutdownHook();

  // app runs here...

  // main method exits, hook is called prior to the app shutting down... }

并且 Spring 的基于 Web 的 ApplicationContext 实现已经有代码可以在相关 Web 应用程序关闭时优雅地处理关闭 Spring IoC 容器。

来源:弹簧框架参考

于 2019-10-18T12:01:17.817 回答