实例化一个容器是简单而直接的。可以通过将一个或多个资源字符串(可以是本地文件系统中,或者是 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 配置表示一个逻辑层或者模块。
 
你可以通过给`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 规范。
 
> 虽然可以通过"../"来引用父路径的文件,但是不推荐这么做。因为这样会创建一个当前应用之外的依赖文件。特别地,被引用的文件也不推荐用"classpath:"URLs(例如:"classpath:../services.xml"),在运行时会选择"最近的"根类路径并跳转到它的父目录,当类路径配置变化时会导致选择了错误的目录。
>
>你可以一直使用全限定资源路径来代替相对路径,如比,你可以使用诸如"file:C:/config/services.xml"或者 "classpath:/config/services.xml"。但是,要知道这会和应用的配置和特定的绝对路径耦合。更好的方式是间接使用绝对路径,比如:使用"${}"占位符来表示绝对路径,它会在 JVM 运行时被系统属性识别。
>
Bean 的命名空间提供了导入指令,更多的配置特性可以通过 Spring 提供的命名空间来获取,比如"context"和"util"等命名空间。
- ---- 阅读说明
- 一、核心技术
- 1.IOC容器
- 1.1.IOC 容器和 Bean 简介
- 1.2.容器概览
- 1.2.1.配置元数据
- 1.2.2.实例化容器
- 1.2.3.使用容器
- 1.3.Bean概览
- 1.3.1.Bean的命名
- 1.3.2.实例化Bean
- 1.4.依赖
- 1.4.1.依赖注入
- 1.4.2.依赖配置详情
- 1.4.5.注入合作者
- 1.4.4.Bean的懒加载
- 1.5.Bean的范围
- 1.6.自定义Bean的特性
- 1.6.1.生命周期回调函数
- 1.7.继承Bean定义
- 1.9.基于注解的容器配置
- 1.9.1.@Required
- 1.12.基于Java的容器配置
- 1.12.3.使用@Bean注解
- 1.15.ApplicationContext的附加功能
- 1.15.4.Web 应用中便捷的 ApplicationContext 实例
- 1.16.BeanFactory
- 2.资源
- 2.7.应用上下文和资源路径
- 3.验证、数据绑定以及类型转换
- 3.5.Spring类型转换
- 3.5.4.ConversionService API
- 5.基于 Spring 的面向切面编程
- 5.8.在 Spring 中使用 AspectJ
- 5.8.1.在 Spring 中使用 AspectJ 注入领域对象
- 二、测试
- 三、数据访问
- 四、Web应用
- 五、Web响应式编程
- 六、集成
- 4.1.介绍
- 七、编程语言