Spring IoC容器 1: 介绍

介绍

控制反转(Inversion of Control, IoC)又被称为依赖注入(Dependency Injection, DI)。对象声明它的依赖,通过构造器参数,工厂方法参数,或者对象实例上的属性。IoC容器创建Bean的时候注入这些依赖。Bean不会自己创建这些依赖,而是反过来让容器创建。

org.springframework.beansorg.springframework.context是Spring IoC容器的基础。

 BeanFactory接口提供了高级配置机制,能管理任何类型的对象。ApplicationContextBeanFactory的子接口,它添加了以下特性:

  • 与Spring AOP集成
  • 消息资源处理(国际化)
  • 事件发布
  • 应用级别的上下文,比如 WebApplicationContext 

简单说,BeanFactory提供了配置框架和基础功能,ApplicationContext添加了更多企业级功能。

在Spring应用中,对象是应用的基石,它们被Spring IoC容器管理,被称为Bean。一个Bean被Spring IoC容器实例化、组装、管理。除此之外,Bean只是一个简单的对象。Bean和它们的依赖通过容器中的配置元数据反映。

容器概述

接口org.springframework.context.ApplicationContext代表Spring IoC容器,它的责任是实例化、组装、管理Bean。容器通过读取配置元数据来实例化、组装、管理Bean。配置元数据被表示为XML配置文件,Java注解或者Java代码。它使你能描述哪些对象组成你的应用,以及对象之间的依赖关系。

Spring提供了几个ApplicationContext的实现。在独立应用中,一般创建 ClassPathXmlApplicationContext 或者 FileSystemXmlApplicationContext的实例。

XML文件是定义配置元数据的传统格式。容器也支持Java注解或者代码,通过定义少量的XML配置来开启这些额外的配置格式。

下图在高层面描述了Spring的工作方式。你的应用中的类和配置组装一起工作。当ApplicationContext被创建并初始化后,你便拥有了一个配置好的、可执行的系统或应用。

container magic
图 1. Spring IoC 容器

配置元数据

正如上图所示,Spring IoC容器需要一种形式的配置元数据。这些配置元数据代表你,作为应用开发者,告诉Spring容器去实例化、配置、组装你的应用中的对象。
传统上,配置元数据通过简洁的XML文件配置。
Spring 2.5引入了Java注解配置支持。
从Spring 3.0开始,许多特性通过Java代码配置。因此,你可以通过Java代码而不是XML来配置Bean。
Spring配置至少包含一个、通常多个Bean的定义。基于XML文件的配置在顶级元素<beans/>下面的<bean/>元素中定义这些Bean。Java代码通常在@Configuration类中@Bean注解的方法中定义。
这些Bean定义对应了应用中的对象。通常,我们定义服务层对象、数据访问对象DAO、表示层对象(Struts的 Action)、基础设施对象(Hibernate的 SessionFactories)、JMS的 Queues。通常不会在容器中配置业务领域对象,因为那一般是DAO或业务逻辑的职责。然而,你可以使用Spring集成AspectJ来配置在容器外创建的对象。
下面的例子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>
  1. id属性是一个标识Bean定义的字符串。
  2. class属性通过完全描述的类名来标识Bean的类型。
id属性的值用来引用合作的对象(依赖)。

实例化容器