【问题标题】:How to close a spring ApplicationContext?如何关闭spring ApplicationContext?
【发布时间】:2013-01-03 15:25:06
【问题描述】:

在我的应用程序完成后,我想关闭 spring 上下文。
相关代码有一个ApplicationContext 引用,但我找不到close 方法。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    将您的 ApplicationContext 向下转换为 ConfigurableApplicationContext,它定义了 close() 方法:

    ((ConfigurableApplicationContext)appCtx).close();
    

    【讨论】:

    • 你也可以投到AbstractApplicationContext
    • @eeezyy - 由于AbstractApplicationContext 是一个类,ConfigurableApplicationContext 是该类实现的接口,因此在大多数情况下使用后者可能会更好。
    • 作为 ConfigurableApplicationContext 现在扩展 Closable (不知道此更改是在哪个版本中进行的,但 4.2.x 的文档显示了它,而 3.0.x 没有)更短版本是((Closable)context).close();
    • 现在还有一个AutoCloseable 实现,这意味着现在可以使用try-with-resources,只要您将上下文存储在AutoCloseable 接口可见的变量中,即try (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
    • 我应该在哪里关闭上下文?我有一个侦听器应用程序,它不断通过 MessageListener 类的 onMessage() 方法获取消息。我应该在哪一部分关闭应用程序上下文以最终关闭执行程序?
    【解决方案2】:

    您需要向JVM注册一个关闭钩子,如下所示:

    ((AbstractApplicationContext)appCtx).registerShutdownHook();
    

    欲了解更多信息,请参阅:Spring Manual: 3.6.1.6 Shutting down the Spring IoC container gracefully in non-web applications

    【讨论】:

    • 奇怪的是,这对我在测试类中不起作用,但在 main() 末尾使用 Avner Levy 的答案确实有效。
    • @JReader - 关闭挂钩在许多情况下都不可靠,并且大多数测试框架(因为通常虚拟机在运行测试之间实际上并没有退出)或相当多的应用程序框架都不会运行。 (例如servlet——基本上任何可以在不终止虚拟机的情况下终止和重新加载应用程序的东西)。除非您知道自己在做什么以及如何使用您的代码,否则您可能不应该使用它们。
    【解决方案3】:

    如果你像下面这样初始化上下文

    ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 
    

    像这样干净的上下文

    ((ClassPathXmlApplicationContext) context).close();
    

    【讨论】:

      【解决方案4】:

      如果 Java SE 7 及更高版本,不要关闭,使用 try-with-resources 确保每个资源在语句结束时关闭。

      try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
      {
           //write your code
      }
      

      【讨论】:

        【解决方案5】:

        关闭ApplicationContext对象的步骤

        1. ApplicationContext 对象类型转换为ConfigurableApplicationContext 对象。
        2. 然后在其上调用 close 对象。

        示例:

         ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");
        
        ((ConfigurableApplicationContext)context ).close();
        

        【讨论】:

          【解决方案6】:
          public static void main(String[] args) {
              ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
              Resturant rstro1=(Resturant)context.getBean("resturantBean");
              rstro1.setWelcome("hello user");
              rstro1.welcomeNote();
              ((ClassPathXmlApplicationContext) context).close();
          

          【讨论】:

          • 在回答旧帖子时,如果您可以为您的回答提供一些上下文而不仅仅是代码,这将很有帮助,因为它可能对其他人更有用。
          【解决方案7】:

          更简单的方法是使用ApplicationContextinterface 的抽象实现。

           AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
          
          context.close();
          

          【讨论】:

            猜你喜欢
            • 2013-06-20
            • 2015-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多