我使用Springframework的ClassPathXMLApplicationContext来初始化一些bean,如下所示:
ctx = new ClassPathXMLApplicationContext(filename);
我在应用程序退出时调用ctx.close()
。
但是,有时 ctx 本身的创建会出现异常(由于某些 bean 创建中的错误),因此我没有获得 ctx 对象。但某些 Bean 可能在出现此异常之前已成功初始化。
我的问题是,在这种情况下,如何执行与 ctx.close() 等效的操作来清理可能已初始化的 bean?
最佳答案
如果您使用的是 Java 7 或更高版本,那么您可以在 try 中使用资源声明上下文初始化,这样您就不需要手动关闭上下文:
try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(filename))
{
//write your code
} catch(Exception e){}
此外,在非 Web 应用程序环境中,您可以向 JVM 注册关闭 Hook 。这样做可以确保正常关闭并在单例 bean 上调用相关的销毁方法,以便释放所有资源。当然,您仍然必须正确配置和实现这些销毁回调。
要注册关闭 Hook ,请调用在 AbstractApplicationContext 类上声明的 registerShutdownHook() 方法:
public static void main(final String[] args) throws Exception {
AbstractApplicationContext ctx
= new ClassPathXmlApplicationContext(new String []{"beans.xml"});
// add a shutdown hook for the above context...
ctx.registerShutdownHook();
// app runs here...
// main method exits, hook is called prior to the app shutting down... }
Spring 的基于 Web 的 ApplicationContext 实现已经具备适当的代码,可以在关闭相关 Web 应用程序时正常关闭 Spring IoC 容器。
关于java - 在 ClassPathXmlApplicationContext 中失败时销毁创建的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58449981/