💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
实例化一个容器是简单而直接的。可以通过将一个或多个资源字符串(可以是本地文件系统中,或者是 Java类路径下的配置文件路径)提供给`ApplicationContext`的构造器,这样容器就可以从多个外部资源中加载配置元数据。 ~~~ //从类路径下加载多个配置文件来创建容器 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); ~~~ > 当你学习了 Spring IOC 容器后,你可能想了解更多与资源抽象有关的信息,该内容在[2.资源](2.资源.md)章节中讲解。它提供了一种方便的机制从URL 语法中定义的位置来读取输入流。特别地,在[2.7.应用上下文和资源路径](2.7.应用上下文和资源路径.md)章节中会讲到:资源路径被用来构建应用上下文。 下面是服务层对象(`services.xml`)的配置文件。 ~~~ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 服务列表 --> <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="itemDao" ref="itemDao"/> <!-- 这里编写此Bean所依赖的其他 Bean的配置 --> </bean> <!-- 这里还有更多服务相关 Bean 的定义 --> </beans> ~~~ 下面是数据访问层对象( `daos.xml`)的配置文件。 ~~~ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao"> <!-- 这里编写此Bean所依赖的其他 Bean的配置 --> </bean> <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao"> <!-- 这里编写此Bean所依赖的其他 Bean的配置 --> </bean> <!-- 这里还有更多数据访问相关 Bean 的定义--> </beans> ~~~ 在前面的样例中,服务层对象由`PetStoreServiceImpl`以及两个数据访问层对象:`JpaAccountDao`,`JpaItemDao`(基于 JPA 对象关系映射规范)组成。`name`表示Bean的属性,`ref`表示对其它 Bean的引用。`id`和`ref`表示了对象间的依赖关系(`id`属性所在 Bean 的定义为被引用方,而另一方则为引用方)。对象依赖的详细配置请参见[1.4.依赖](1.4.依赖.md)。 * * * * * ### **组合基于 XML 的配置元数据文件** 分隔Bean 的定义到多个配置文件是有意义的,在应用的架构中,每一个独立的XML 配置表示一个逻辑层或者模块。 &emsp; 你可以通过给`ApplicationContext`的构造器中传入多个资源路径,以此来从多个地方加载配置文件,就像上一小节展示的那样。此外,你也可以通过`<import>`标签从其他文件中加载 Bean 的定义,比如: ~~~ <beans> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans> ~~~ 在上面的例子中加载了三个外部Bean 的定义文件:`services.xml`、`messageSource.xml`、`themeSource.xml`。因为都是导入的相对路径,所以`services.xml`必须和导入文件(总的配置文件)处于同一目录或者类路径下。而`messageSource.xml`和`themeSource.xml`必须在导入文件所在目录的resource目录下。正如你所看到的,路径前面的斜线都被忽略了,考虑到给定的路径都是相对的,所以最好都不加斜线。所有被导入的文件都处于顶级标签`<bean/>`之下,必须遵循 Spring 定义的 XML 规范。 &emsp; > 虽然可以通过"../"来引用父路径的文件,但是不推荐这么做。因为这样会创建一个当前应用之外的依赖文件。特别地,被引用的文件也不推荐用"classpath:"URLs(例如:"classpath:../services.xml"),在运行时会选择"最近的"根类路径并跳转到它的父目录,当类路径配置变化时会导致选择了错误的目录。 > >你可以一直使用全限定资源路径来代替相对路径,如比,你可以使用诸如"file:C:/config/services.xml"或者 "classpath:/config/services.xml"。但是,要知道这会和应用的配置和特定的绝对路径耦合。更好的方式是间接使用绝对路径,比如:使用"${}"占位符来表示绝对路径,它会在 JVM 运行时被系统属性识别。 > Bean 的命名空间提供了导入指令,更多的配置特性可以通过 Spring 提供的命名空间来获取,比如"context"和"util"等命名空间。