一,综述
在spring IOC容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,只实现了容器的基本功能
一个是ApplicationContext应用上下文,它作为容器的高级形态存在。应用上下文在简单容器的基础上增加了许多面向框架的特性,同时
对应用环境做了许多适配。
在spring提供基的基本IOC容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及
他们之间的依赖关系。简单说BeanDefinition 就是 依赖关系的数据结构
二,Spring IOC 容器的设计
(图由Astah完成)
下面对接口做一些简要的分析
- 第一条,BeanFactory--》HierarchicalBeanFactory--》ConfigurableBeanFactory 主要设计路径,其中
HierarchicalBeanFactory继承BeanFactory基础上增加了getParentBeanFactory()接口功能,使BeanFactory具备了双亲IOV容器的管理功能
ConfigurableBeanFactory 主要定义了对BeanFactory的配置功能,比如setParentBeanFactory()设置双亲IOC容器
- 第二条,以ApplicationContext应用上下文为核心的接口设计。
- 这里涉及的主要是接口关系,而具体的IOC容器都是在这个接口体系下实现的。
- 总结,这个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是IOC容器的最基本接口,
等接口,具备基本的容器功能;另一方面又继承了MessageSource,ResouceLoader,ApplicationEventPublisher这些接口,赋予了更高级的IOC
容器特性等等。
三,BeanFactory的应用场景
getBean();这个方法是使用IOC容器API的主要方法。其中可以通过prototype来确定指定的bean
此外提供一下方法:
public interface Beanfactory {
String FACTORY_BEAN_PREFIX = “&”;
Object getBean (String name) throws BeansException;
<T> T getBean(String name, Class<T> requredType) throws BeansException;
Object getBean (String name,,Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanFactoryDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanFactoryDefinitionException;
boolean isTypeMatch(String name) throws NoSuchBeanFactoryDefinitionException;
Class getType(String name) throws NoSuchBeanFactoryDefinitionException;
String[] getAliases(Stirng name);
}
这些接口方法是最为基本的容器入口。
四,BeanFactory容器的设计原理
注意:DefaultListableFactory 最重要的一个类。已经作为容器系列中的一个基本产品
编程式使用IOC容器
ClassPathResource res = new ClassPathResource("bean.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeaDefinitionReader reader = new XmlBeaDefinitionReader (factory);
reader.loadBeanDefinitions(res);
这样我们就可以通过factory 对象来 使用 DefaultListableBeanFactory这个IOC容器
在使用IOC容器时需要如下几个步骤
1.创建IOC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息
2.创建一个BeanFactory,这里使用DefaultListableFactory。
3.创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFacory。
4.从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义后,需要的IOC容器就创立起来了。