Java 如何关闭spring应用程序上下文?

Java 如何关闭spring应用程序上下文?,java,spring,Java,Spring,应用程序完成后,我想关闭spring上下文。 相关代码有一个ApplicationContext引用,但我找不到close方法。向下转换您的定义方法: 您需要向JVM注册一个关机挂钩,如下所示: ((AbstractApplicationContext)appCtx).registerShutdownHook(); 有关更多信息,请参见:如果您像下面一样初始化上下文 ApplicationContext context = new ClassPathXmlApplicationContext(

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

向下转换您的定义方法:


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

((AbstractApplicationContext)appCtx).registerShutdownHook();

有关更多信息,请参见:

如果您像下面一样初始化上下文

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 
像这样清晰的背景

((ClassPathXmlApplicationContext) context).close();

如果Java SE 7及更高版本不关闭,请使用try with resources,确保在语句末尾关闭每个资源

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

关闭
ApplicationContext
对象的步骤

  • 键入将
    ApplicationContext
    对象强制转换为
    ConfigurableApplicationContext
    对象
  • 然后调用该对象上的close对象
  • 例如:

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

    您还可以强制转换到
    AbstractApplicationContext
    @eeezyy-因为
    AbstractApplicationContext
    是一个类,而
    ConfigurableApplicationContext
    是该类实现的接口,在大多数情况下,使用后者可能更好。由于
    ConfigurableApplicationContext
    现在扩展了
    Closable
    (不知道该更改是在哪个版本中进行的,但4.2.x的文档显示了这一点,而3.0.x没有)更短的版本是
    ((Closable)上下文)。close()。现在还有一个
    AutoCloseable
    实现,这意味着现在可以使用try with resources,只要您将上下文存储在
    AutoCloseable
    界面可见的变量中,即
    try(ConfigurableApplicationContext=new…{/*您的代码在这里*/}//当您离开try块时,上下文被关闭
    我应该在哪里关闭上下文?我有一个侦听器应用程序,它不断地通过MessageListener类的onMessage()方法获取消息。我应该在哪一部分关闭应用程序上下文以最终关闭executor?奇怪的是,这在测试类中对我不起作用,但在main()末尾使用Avner Levy的答案确实起作用。@JReader-shutdown钩子在许多情况下都不可靠,大多数测试框架都不运行(因为通常VM不会在运行测试之间退出)或相当多的应用程序框架(例如servlets——基本上可以在不终止虚拟机的情况下终止并重新加载应用程序的任何东西)。除非你知道自己在做什么以及你的代码将如何使用,否则你可能不应该使用它们。。在回答一篇旧帖子时,如果你能为你的答案提供一些上下文,而不仅仅是代码,那会很有帮助,因为这可能会使它对其他人更有用。
     ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");
    
    ((ConfigurableApplicationContext)context ).close();
    
    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();