Spring学习5(2)
基本介绍
Spring通过配置文件来描述Bean和Bean之间的依赖关系,利用java来对Bean实例化并建立Bean之间的依赖关系。
BeanFactory是spring框架最核心的接口,它提供了高级IoC的配置机制,它使管理不同类型的java对象成为可能。
ApplicationContext建立在BeanFactory基础之上,提供了更多面向应用的功能,更易于创建实际应用。
一般称BeanFactory为IoC容器,而ApplicationContext为应用上下文,但有时也叫ApplicationContext为spring容器。
对于二者的区别是BeanFactory是spring框架的基础,面向spring本身;ApplicationContext面向spring框架的开发者,基本开发场景都使用ApplicationContext。
BeanFactory
beanfactory是一个类工厂,但和传统的类工厂不同,它是类的通用工厂,所有可以被spring容器实例化并管理的java类都可以成为spring的bean。
BeanFactory的类体系结构
BeanFactory是不断的继承发展而来从而形成了一个类的结构树,BeanFactory这个接口就位于类结构树的顶端,其主要方法就是getBean(String beanName)来获得特定名称的Bean。它的功能通过其他接口而不断的扩展。
下面这张图是书中给出的结构图:
这其中有如下的接口:
- ListableBeanFactory:定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,容器中是否包含这某一个特定的Bean等。
- HierarchicalBeanFactory:父子级联IoC容器的接口,子容器可以通过接口访问父容器。
- ConfigurableBeanFactory:增强了IoC容器的可定制性,定义了设置类装载器,属性编辑琦等方法。
- AutoWirecapableBeanFactory:定义了将容器中的Bean按某种规则进行自动装配的方法。
- SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean的方法。
- BeanDefinitionRegistry:Spring配置文件中的每一个
<bean>
节点元素在spring容器中都通过一个BeanDefinition对象表示,它描述了Bean的配置对象信息。而这个接口提供了向容器手工注册BeanDefinition对象的方法。
初始化BeanFactory
使用spring配置文件来提供配置信息,然后通过BeanFactory装配配置文件,最后启动springIoC容器。
这里我们通过上一节Car的例子来说明。首先将Car放到com.smart包下,在resourcecs/com/smart/beanfactory下创建beans.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="car1" class="com.smart.Car"
p:brand="红旗CA72"
p:color="黑色"
p:maxSpeed="200"
/>
</beans>
接下来就是利用BeanFactory来实现容器的启动,这里注意的是不要用XmlBeanFactory了,这个接口已经被弃用了,我们使用XmlBeanDefinitionReader,DefaultListableBeanFactory实现类启动spring的IoC容器。代码如下:
package com.smart.beanfactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import com.smart.Car;
import org.testng.annotations.*;
import static org.testng.Assert.*;
public class BeanFactoryTest{