一.概述
Spring FrameWork的第一大核心,IoC是对对象进行控制反转,也成为依赖注入.依赖控制反转(把对象的控制权从业务的业务对象手中转交给平台或者框架)的模式有很多种,在spring中IoC容器是实现这个模式的载体.
依赖注入的方式:1.接口注入;2.setter注入;3.构造器注入.IoC设计中,setter和构造器注入是主要的注入方式.
二.IoC中两个主要的容器系列
1.实现了BeanFactory接口的简单容器系统,实现了容器的最基本功能
2.ApplicationContext应用上下文,作为容器的高级形态存在.
容器中起作用的主要数据类型是BeanDefinition,它是对依赖反转模式中管理的对象依赖关系的数据抽象,依赖反转功能都是围绕着对这个BeanDefinition的处理完成的.
三.IoC容器的设计
从上面接口设计图中可以看到两条主要的设计主线:
第一条从BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是主要的BeanFactory设计路径.通过这些接口设计的叠加,定义了BeanFactory就是简单IoC容器的基本功能.
第二条是以ApplicationContext应用上下文接口为核心的接口设计.对于AppilcationContext除了细化了许多BeanFactory的接口能外之外,还通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,添加了许多对高级容器的特性的支持.
1).BeanFactory的应用场景
package com.zqr.SpringDetail.org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
public interface BeanFactory {
/**
* 用&符号获取BeanFactory本身,用来区分通过容器获取FactoryBean产生的对象和FactoryBean本身.
* 比如:myJndiObject是一个FactoryBean,使用&myJndiObject获取到的是FactoryBean,而不是myJndiObject产生的对象.
*
* Pass:
* BeanFactory与FactoryBean
* BeanFactory是一个Factory,用来管理Bean;
* FactoryBean是一个工厂Bean,能够产生和修饰对象生成.
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 使用不同的Bean检索方法,从IoC容器中得到所需要的Bean,从而忽略具体的IoC实现.
*这些检索方法代表的是最为基本的容器入口.
*/
Object getBean(String name) throws BeansException;
T getBean(String name, Class requiredType) throws BeansException;
T getBean(Class requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
T getBean(Class requiredType, Object... args) throws BeansException;
/**
* 容器是否含有指定名字的Bean
*/
boolean containsBean(String name);
/**
* 指定名字的Bean是否是Singleton类型.
* Pass:对于Singleton属性,可以在BeanDefinition中指定.
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 指定名字的Bean是否是Prototype类型.
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 查询指定名字的Bean的Class类型是否是特定的Class类型.
*/
boolean isTypeMatch(String name, Class> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 查询指定名字的Bean的Class类型.
*/
Class> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 查询指定名字的Bean的所有别名.这些别名都是用户在BeanDefinition中定义的.
*/
String[] getAliases(String name);
}
2).BeanFactory容器的设计原理
以XmlBeanFactory为例,最底层实现,与应用上下文相比,显著的特点是:它能提供最基本的IoC容器功能.
1.继承DefaultListableBeanFactory拥有默认完成的IoC容器功能外,还可以读取Xml文件定义BeanDefinition.
2.XmlBeanFactory源码实现读取Xml文件功能
@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
/**
* 总结分析具体的实现步骤:
* 1.创建IoC配置文件的抽象资源resource,资源包含了BeanDefinition.
* 2.创建BeanFactory,这里使用DefaultListableBeanFactory.
* 3.创建BeanDefinition读取器,这里使用XmlBeanDefinitionReader,通过回调配置给BeanFactory.
* 4.从定义好的资源位置读入配置信息,由XmlBeanFactory完成具体的解析过程.最终建立起IoC容器.
*
*
编程式实现
ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
}
3).ApplicationContext的应用场景
appicationContext是一个高级形态的IoC容器,在BeanFactory的基础上添加了额外的功能,从而具备了新特性:
4).ApplicationContext容器的设计原理
如:以FileSystemXmlApplicationContext来说明ApplicationContext的设计原理.
ApplicationContext应用上下文的主要功能已经在FileSystemXmlApplicationContext的基类AbstractXmlApplicationContext中实现,它只需要实现和它自身设计相关的两个功能即可.