【发布时间】:2013-01-03 15:25:06
【问题描述】:
在我的应用程序完成后,我想关闭 spring 上下文。
相关代码有一个ApplicationContext 引用,但我找不到close 方法。
【问题讨论】:
在我的应用程序完成后,我想关闭 spring 上下文。
相关代码有一个ApplicationContext 引用,但我找不到close 方法。
【问题讨论】:
将您的 ApplicationContext 向下转换为 ConfigurableApplicationContext,它定义了 close() 方法:
((ConfigurableApplicationContext)appCtx).close();
【讨论】:
AbstractApplicationContext
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
您需要向JVM注册一个关闭钩子,如下所示:
((AbstractApplicationContext)appCtx).registerShutdownHook();
欲了解更多信息,请参阅:Spring Manual: 3.6.1.6 Shutting down the Spring IoC container gracefully in non-web applications
【讨论】:
如果你像下面这样初始化上下文
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 对象。示例:
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();
【讨论】:
更简单的方法是使用ApplicationContextinterface 的抽象实现。
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
context.close();
【讨论】: