首页 > 代码库 > Spring--IoC
Spring--IoC
1.简介
org.springframework.beans 及 org.springframework.context 包是 Spring IoC 容器的基础。B
BeanFactory 提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext 是 BeanFactory 的扩展,功能得到了进一步的加强。简而言之,BeanFactory 提供了配置框架及基本功能,而 ApplicationContext 完全由 BeanFactory 扩展而来,因而 BeanFactory 所具备的能力和行为也适用于 ApplicationContext。
2.容器和 bean 的基本原理
在 Spring 中,那些组成应用的主体及由 Spring IoC 容器所管理的对象被称之为 bean。简单的讲,bean 就是由 Spring 容器初始化、装配及被管理的对象。而 bean 定义以及 bean 相互间的依赖关系将通过配置元数据来描述。
2.1容器
org.springframework.factory.BeanFactory 是 SpringIoC 容器的实际代表者,IoC 容器负责容纳此前所描述的 bean,并对 bean 进行管理。
在 Spring 中,BeanFactory 是 IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
Spring 提供了很多易用的 BeanFactory 实现,XmlBeanFactory 就是最常用的一个。http://docs.spring.io/spring/docs/current/javadoc-api/
2.1.1配置元数据
从上图可以看到,Spring IoC 容器将读取配置元数据;并通过它对应用中各个对象进行实例化、配置及组装。
Spring 支持三种配置元数据格式:XML 格式、Java 属性文件格式或使用 Spring 公共 API 编程实现。通常情况下我们使用简单直观的 XML 来作为配置元数据的描述格式。
Spring IoC 容器可以通过多种途径来加载配置元数据,比如本地系统、Java Classpath 等。
Spring IoC 容器至少包含一个 bean 定义,但大多数情况下会有多个 bean 定义。
bean 定义与应用程序中实际使用的对象一一对应。通常情况下 bean 的定义包括:服务层对象、数据访问层对象(DAO)、类似 Structs Action 的表示层对象、Hibernate SessionFactory 对象、JMS Queue 对象等等。
以下是一个基于 XML 配置元数据的基本结构:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> 6 7 <bean id="ioCDemo01" class="demo.ioc.IoCDemo01" > 8 </bean> 9 10 </beans>
2.2实例化容器
1 package demo.ioc; 2 3 import org.springframework.beans.factory.BeanFactory; 4 import org.springframework.beans.factory.xml.XmlBeanFactory; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 import org.springframework.core.io.ClassPathResource; 8 import org.springframework.core.io.FileSystemResource; 9 import org.springframework.core.io.Resource; 10 11 public class Test { 12 13 public static void main(String[] args) { 14 String fileName = "applicationContext.xml"; 15 16 //1 17 // Resource resource = new FileSystemResource(fileName); 18 // BeanFactory factory = new XmlBeanFactory(resource); 19 20 //2 21 // ClassPathResource resource = new ClassPathResource(fileName); 22 // BeanFactory factory = new XmlBeanFactory(resource); 23 24 //3 25 ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{fileName}); 26 BeanFactory factory = (BeanFactory) context; 27 28 IoCDemo01 ioCDemo01 = (IoCDemo01) factory.getBean("ioCDemo01"); 29 ioCDemo01.show(); 30 } 31 32 }
2.2.1组成基于 XML 配置元数据
将 XML 配置文件分拆成多个部分是非常有用的。为了加载多个 XML 文件生成一个 ApplicationContext 实例,可以将文件路径作为字符串数组传给 ApplicationContext 构造器。而 beanfactory 将通过调用 bean defintion reader 从多个文件中读取 bean 定义。
通常情况下,更倾向于上述做法,因为这样各个配置并不会查觉到与其他配置文件的组合。另外一种方法是使用一个或多个的 <import /> 元素来从另外一个或多个文件加载 bean 定义。所有的 <import /> 元素必须放在 <bean /> 元素之前以完成 bean 的导入。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> 6 7 <import resource="applicationContext2.xml"/> 8 9 <bean id="ioCDemo01" class="demo.ioc.IoCDemo01" > 10 </bean> 11 12 </beans>
2.3多种 bean
Spring IoC 容器管理一个或多个 bean,这些 bean 将通过配置文件中的 bean 定义被创建。
在容器内部,这些 bean 的定义由 BeanDefinition 对象来表示,该定义将包含以下信息:
全限定类名:这通常就是已定义 bean 的实际实现类。如果通常调用 static factory 方法来实例化 bean,而不是使用常规的构造器,那么类名实际上就是工厂类的类名。
bean 行为的定义,即创建模式(prototype 还是 singleton)、自动装配模式、依赖检查模式、初始化及销毁方法。这些定义将决定 bean 在容器中的行为。
用于创建 bean 实例的构造器参数及属性值。比如使用 bean 来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。
bean 之间的关系,即协作(或者称依赖)。
除了通过 bean 定义来描述要创建的指定 bean 的属性之外,某些 BeanFactory 的实现也允许将那些非 BeanFactory 创建的、已有的用户对象注册到容器中,比如使用 DefaultListableBeanFactory 的 registerSingleton(..) 方法。不过大多数应用还是采用元数据定义为主。
2.3.1命名 bean
bean 的命名采用标准的 Java 命名约定,即小写字母开头,首字母大写间隔的命名方式。
对 bean 采用统一的命名约定将会使配置更加简单易懂。而且在使用 Spring AOP 时,如果要发通知(advice)给一组名称相关的 bean 时,这种简单的命名方式会受益匪浅。
每个 bean 都有一个或多个 id(或称之为标识符或名称)。这些 id 在当前 IoC 容器中必须唯一。如果一个 bean 有多个 id,那么其他的 id 在本质上将被认为是别名。
当使用基于 XML 的配置元数据时,将通过 id 或 name 属性来指定 bean 标识符。
Spring--IoC