文档介绍:第19章 Spring的IoC
本章将详细深入地探讨Spring框架的控制反转实现(Inversion of Control,IoC)原理。Spring框架所提供的众多功能之所以能成为一个整体,正是创建在IoC的基础之上,因此对这一内涵简单、外延丰富的技术有必要进行详细的介绍。
Bean工厂
IoC容器的实际代表者,IoC容器负责容纳此前所描述的bean,并对bean进行管理。如图所示,Spring中IoC容器就是对象的加工厂,可以按照元数据填充和组装Java对象。
创建Bean工厂
在Spring中,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及创建这些对象间的依赖。
从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory可以访问bean定义。Spring提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。
使用多个文件
将XML配置文件分拆成多个部分是非常有用的。为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext构造函数。而bean factory将通过调用bean defintion reader从多个文件中读取bean定义。
通常情况下,Spring团队倾向于上述做法,因为这样各个配置并不会查觉到它们与其他配置文件的组合。另外一种方法是使用一个或多个的<import/>元素来从另外一个或多个文件加载bean定义。
获取Bean
就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。
当使用基于XML的元数据配置文件,可以这样来指定bean类:
<bean id="exampleBean" class=""/>
<bean name="anotherExample" class=""/>
BeanFactory的其它方法
除了getBean()方法可以取得bean的实例;BeanFactory还提供其他的方法供客户代码调用:
boolean containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true。
Object getBean(String):返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常
BeanFactory的其它方法
Object getBean(String, Class):返回以给定名称注册的bean实例,并转换为给定class类型的实例,如果转换失败,相应的异常(BeanNotOfRequiredTypeException)将被抛出。上面的getBean(String)方法也适用该规则。
Class getType(String name):返回给定名称的bean的Class。如果没有找到指定的bean实例,则抛出NoSuchBeanDefinitionException异常。
boolean isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式(singleton将在bean的作用域中讨论),如果bean没找到,则抛出NoSuchBeanDefinitionException异常。
String[] getAliases(String):返回给定bean名称的所有别名。
配置Bean
在Spring中,那些组成应用的主体(backbone)及由Spring IoC容器所管理的对象被称之为bean。简单地讲,bean就是由