如何关闭Spring ApplicationContext?

90

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

7个回答

158

13
你也可以将其转换为 AbstractApplicationContext - eeezyy
3
由于AbstractApplicationContext是一个类,而ConfigurableApplicationContext是由该类实现的接口,因此在大多数情况下最好使用后者。 - Periata Breatta
3
由于ConfigurableApplicationContext现在扩展了Closable接口(不知道是在哪个版本中进行的更改,但是4.2.x的文档中显示了这一点,而3.0.x则没有),所以更简短的写法是((Closable)context).close(); - Periata Breatta
6
现在也有一个“AutoCloseable”实现,这意味着可以使用try-with-resources,只要将上下文存储在变量中,其中可见“AutoCloseable”接口,即try (ConfigurableApplicationContext context = new ....) { /* 在这里编写您的代码 */ } // 当您离开try块时,上下文被关闭 - Periata Breatta
我应该在哪里关闭上下文?我有一个监听器应用程序,它通过MessageListener类的onMessage()方法不断接收消息。在哪个部分应该关闭应用程序上下文以最终关闭执行器? - Wax
如果当前的ApplicationContext有一个父级,那么我应该关闭父级吗? - Cristiano

36

奇怪的是,在我的测试类中这并不起作用,但使用Avner Levy在main()末尾的答案确实有效。 - JReader
1
@JReader - 关闭挂钩在许多情况下并不可靠,并且大多数测试框架不会运行它们(因为通常在运行测试之间,虚拟机实际上并没有退出),或者相当多的应用程序框架。(例如servlets-可以终止和重新加载应用程序而不终止虚拟机的任何内容)。除非您知道自己在做什么以及如何使用代码,否则最好不要使用它们。 - Periata Breatta

15
如果使用 Java SE 7 及更高版本,请不要关闭资源,而是使用 try-with-resources 语句,它可以确保每个资源在语句结束时都被关闭。
try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}

14

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

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

像这样的干净环境

((ClassPathXmlApplicationContext) context).close();

1

关闭ApplicationContext对象的步骤:

  1. ApplicationContext对象强制转换为ConfigurableApplicationContext对象。
  2. 然后调用该对象上的close方法。

示例:

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

((ConfigurableApplicationContext)context ).close();

1
甚至更简单的方法是使用ApplicationContextinterface的抽象实现。
 AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接