关闭 ApplicationContext 总是(在使用后)是个好主意吗?

Is closing an ApplicationContext always (after its use) a good idea?

我正在开发 Spring 批处理应用程序,我是否已将 spring xml 配置分类为 4 个文件。前 2 个文件包含 spring 批处理数据库和核心应用程序 bean 定义(即 database.xmlcontext.xml)。接下来的 2 个文件是动态的,从某种意义上说,它们取决于要执行的批处理脚本。

因此执行批处理脚本包括加载 context.xmldatabase.xml + 2 个脚本相关文件。

例如,要执行 "batch script 1",我必须加载 batch1.xmltasklet1.xml 以及 2 个核心配置,以执行 "batch script 2",我必须加载 batch2.xmltasklet2.xml 以及 2 个核心配置等等..

由于这种情况,当收到对 运行 批处理脚本的请求时,我需要创建一个新的 ApplicationContext。现在,一旦我创建并使用我的 ApplicationContext,我就会通过调用 close() 方法来销毁它们。我的问题是,为每个 运行 创建和销毁 ApplicationContext 是一个好主意(性能和内存方面)吗?或者有什么好的替代方法吗?

编辑:我已经在使用分层上下文。这意味着,对于 2 个核心配置,我正在创建一个 ApplicationContext 并将其保存在内存中(静态变量)。对于一个新请求,我正在创建一个新的 ApplicationContext 并将核心上下文作为父级。

public void runBatch(String batchXmlLoc, String taskletXmlLoc) {
    ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{batchXmlLoc, taskletXmlLoc}, getParent());
    //... do the work...
   ((ClassPathXmlApplicationContext)context).close();
}

private static ApplicationContext parent;

private ApplicationContext getParent() {
   if(parent == null) {
        parent = new ClassPathXmlApplicationContext("database.xml", "context.xml");
   }
   return parent;
}

除非您需要在使用后重新启动上下文(这无论如何都会指示编码错误),否则您可以简单地使用分层上下文。 使用您的数据库和核心定义创建根上下文,然后使用以下构造函数创建两个子上下文:

public ClassPathXmlApplicationContext(String[] configLocations,
                                  ApplicationContext parent)

两个子上下文不会互相看到或干扰。

如果您需要重新启动上下文,您应该考虑重构您的设置。 spring 上下文不应该包含任何像这样的状态信息。一个可能的解决方案可能是创建一个工厂 bean,它采用 运行 参数并为批处理 运行.

构建必要的 类