java - 在 ClassPathXmlApplicationContext 中失败时销毁创建的 bean

标签 java spring applicationcontext spring-framework-beans

我使用Springframework的Cla​​ssPathXMLApplicationContext来初始化一些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 容器。

source: spring-framework-reference

关于java - 在 ClassPathXmlApplicationContext 中失败时销毁创建的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58449981/

相关文章:

java - Java 中另一个类中未见的已初始化对象

java - 如何保证 `Spring-Data`中的每一个数据库事务都按顺序执行?

java - 使用 Spring 和 IBATIS 进行特定查询的不同数据源

java - 是否可以将一个上下文注入(inject)到另一个上下文中?

java - Java 中的 mousePressed() 方法似乎不起作用

Java:正确的网络 IO 处理?

java - Jenv - 多次添加相同的 Java 版本

java - Spring MVC Controller 映射不起作用

java - 如何在运行时在 spring 中重新加载/刷新属性而不重新启动 jvm?

java - Maven surefire 测试重用 fork 与 parallel