首页 > 代码库 > 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