上一篇:Spring Core /01 IoC 容器 / IoC 容器 和 Beans 介绍
样例代码:Spring Core Sample
参考文献:The IoC Container
org.springframework.context.ApplicationContext
接口代表 Spring 的 IoC 容器,负责实例化、配置、装配 Bean
容器通过读取配置元数据来获知如何实例化、配置、装配对象
配置元数据由 XML、Java 注解或 Java 代码来表示
Spring 提供了多个 ApplicationContext
接口的实现
在独立运行的应用中,通常会使用 ClassPathXmlApplicationContext
或 FileSystemXmlApplicationContext
XML 是定义 “ 配置元数据 ” 的传统形式,也可以使用 Java 注解或 Java 代码的形式来定义 ” 配置元数据 ”
只需要少量的 XML 配置就可以声明式地开启对 Java 注解或 Java 代码形式的 ” 配置元数据 ” 的支持
在大多的场景下,不需要显式的用户代码来实例化一个或多个 Spring IoC 容器
例如在 Web 应用的场景,web.xml 中少量几行固定模式的 Web 描述符就能满足需求
如果使用 Spring Tools for Eclipse,简单点击几下鼠标就能创建这些模板化的配置
下边的图片从高层展示了 Spring 是如何工作的
应用中定义的类型与配置元数据相结合
当 ApplicationContext
被创建并初始化之后,就得到了一个配置好的可执行的系统或应用
1. 配置元数据(Configuration Metadata)
应用开发者通过 “ 配置元数据 ” 来告知 Spring IoC 容器如何实例化、配置、装配对象
“ 配置元数据 “ 的传统形式是 XML 文件
Spring 2.5 引入了基于注解的 ” 配置元数据 ”
Spring 3.0 引入了基于 Java 代码的 ” 配置元数据 ”
Spring IoC 容器和配置元数据的形式是完全解耦的
配置的 Bean 一般都是用来构成应用的对象,而非领域对象(即:功能结构对象,而非业务对象)
这些 Bean 一般包括:
服务层对象、数据访问对象(DAO)、表示层对象(如 Struts 的 Action)、基础设施对象(如 Hibernate 的 SessionFactories
、JMS 的 Queues
)
一般不会将细粒度的领域对象配置为容器中的 Bean
因为创建和管理领域对象通常是数据访问对象(DAO)和业务逻辑的责任
但是可以使用 Spring 集成的 AspectJ 来配置那些 Spring IoC 容器范围外的对象
参考:Using AspectJ to dependency-inject domain objects with Spring
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="..."> (1)(2)
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
- 一个 <bean> 代表一个 Bean 定义,
id
属性为 Bean 对象指定了唯一标识,可以用于在配置中引用某个 Bean 对象 class
属性使用类型的完全限定名,指定了 Bean 的类型
2. 实例化一个容器
ApplicationContext
构造器参数传入的一个或多个路径指定了资源的位置
容器会根据这些资源位置,从各种不同的外部资源载入 “ 配置元数据 ”,例如本地文件系统、Java CLASSPATH 等等
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
}
}
下边的例子展示了 Service 层对象的配置文件(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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean id="petStore" class="spring.core.sample.app.service.impl.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
上一篇:Spring Core /01 IoC 容器 / IoC 容器 和 Beans 介绍
样例代码:Spring Core Sample