我有几个项目都使用一个项目作为数据模型。这些项目中的每一个都有自己的 applicationContext.xml 文件,其中包含一堆重复的数据内容。
我想要一个 modelContext.xml 文件和另一个用于我的 ui.xml 等。
我可以这样做吗?
来自Spring Docs(v 2.5.5 第 3.2.2.1 节):
将容器定义拆分为多个 XML 文件通常很有用。然后加载从所有这些 XML 片段配置的应用程序上下文的一种方法是使用应用程序上下文构造函数,该构造函数采用多个资源位置。使用 bean 工厂,可以多次使用 bean 定义阅读器依次从每个文件中读取定义。
一般来说,Spring 团队更喜欢上述方法,因为它使容器配置文件不知道它们正在与其他文件组合。另一种方法是使用元素的一个或多个实例从另一个文件(或多个文件)加载 bean 定义。让我们看一个示例:
<import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/>
在这个例子中,外部 bean 定义是从 3 个文件加载的,services.xml、messageSource.xml 和 themeSource.xml。所有位置路径都被认为是相对于执行导入的定义文件,因此在这种情况下 services.xml 必须与执行导入的文件位于同一目录或类路径位置,而 messageSource.xml 和 themeSource.xml 必须位于资源中位置低于导入文件的位置。如您所见,前导斜杠实际上被忽略了,但考虑到这些被认为是相对路径,完全不使用斜杠可能是更好的形式。被导入文件的内容必须是根据 Spring Schema 或 DTD 的有效 XML bean 定义文件,包括顶级元素。
我们在我们的项目中使用 Spring 中的 classpath* 资源加载器来执行此操作。对于某个应用程序,将加载所有包含应用程序 id 的 appcontext 文件:
classpath*:springconfig/spring-appname-*.xml
是的,您可以通过 import 元素执行此操作。
<import resource="services.xml"/>
每个元素的资源属性都是一个有效的路径(例如 classpath:foo.xml)
鉴于 Nicholas 向我指出的内容,我在文档中发现了这一点。它允许我在运行时选择我感兴趣的 bean 上下文。
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml"));
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml"));
ctx.refresh();
这是我为我的一个项目所做的。在您的web.xml
文件中,您可以定义您希望应用程序使用的 Spring bean 文件:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/modelContext.xml
/WEB-INF/ui.xml
</param-value>
</context-param>
如果这没有在你的 中定义web.xml
,它会自动寻找/WEB-INF/applicationContext.xml
另一件需要注意的事情是,尽管您可以这样做,但如果您不是 XML 的忠实粉丝,您可以在 Spring 2.5 中使用注释做很多事情。
是的,您可以使用“主”bean 文件中的标签。但是为什么?为什么不在 bean 工厂的 wab.xml 或 als 位置数组的 contextConfigLocation 上下文参数中列出文件?
我认为多个文件更容易处理。您可以只选择其中一些进行测试,只需添加重命名或删除应用程序的一部分,您可以将不同的应用程序绑定到相同的配置文件(一个 webapp 和一个带有一些重叠 bean 定义的命令行版本)。