如何关闭spring的ApplicationContext?


Answers:


149

垂头丧气你ApplicationContextConfigurableApplicationContext定义close()的方法:

((ConfigurableApplicationContext)appCtx).close();

13
您也可以投射到AbstractApplicationContext
eeezyy 2014年

3
@eeezyy-因为AbstractApplicationContext是一个类,并且ConfigurableApplicationContext是由该类实现的接口,所以在大多数情况下使用后者可能更好。
Periata Breatta

3
随着ConfigurableApplicationContext现在的扩展Closable(不知道此更改是在哪个版本中进行的,但是4.2.x的文档显示了该更改,而3.0.x并未显示),因此要短得多((Closable)context).close();
Periata Breatta '16

6
现在还有一个AutoCloseable实现,这意味着只要您将上下文存储在AutoCloseable界面可见的变量中即可使用try-with-resources ,即try (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta

我应该在哪里关闭上下文?我有一个侦听器应用程序,该应用程序不断通过MessageListener类的onMessage()方法获取消息。我应在哪一部分关闭应用程序上下文以最终关闭执行程序?

36

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

((AbstractApplicationContext)appCtx).registerShutdownHook();

有关更多信息,请参见:Spring手册:3.6.1.6在非Web应用程序中正常关闭Spring IoC容器


奇怪的是,这在测试课程中对我不起作用,但是在main()末尾使用Avner Levy的答案确实可行。
JReader

1
@JReader-关闭挂钩在许多情况下都不可靠,并且大多数测试框架(因为通常在运行测试之间虚拟机实际上并没有退出)或许多应用程序框架(例如servlet)都无法运行。终止并重新加载应用程序,而不必终止虚拟机。你可能,除非你知道你在做什么,以及如何你的代码将被用于不应该使用他们..
Periata Breatta


12

如果Java SE 7和更高版本没有关闭,请使用try-with-resources来确保在语句末尾关闭每个资源。

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

1

关闭ApplicationContext对象的步骤

  1. 类型将ApplicationContext对象强制转换为ConfigurableApplicationContext对象。
  2. 然后调用该对象的close对象。

例:

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

((ConfigurableApplicationContext)context ).close();

1
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();

1
回答旧帖子时,如果您可以为答案提供一些上下文而不只是代码,那将很有帮助,因为它可能使它对其他人更有用。
David Buck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.