在Spring IOC体系中最重要的两个部分就是BeanFactory和BeanDefinition。
BeanFactory:
BeanFactory是一系列工厂的接口,典型的工厂模式,BeanFactory来实例化、配置和管理对象。BeanFactory和很多具体的实现类,先来看一下BeanFactory接口本身的定义,它直接定义了IOC容器的基本行为。
public interface BeanFactory {
//这里是对FactoryBean的转义定义。 //如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,转义符“&”用来获取FactoryBean本身
String FACTORY_BEAN_PREFIX = "&";
//根据bean的名字来获得IOC容器中的bean实例 需要强转
Object getBean(String name) throws BeansException;
//根据bean的名字和Class<T>来获得IOC容器中的bean实例
//不需要强转,在函数内部根据Class<T>转换成目标类型
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
//根据Class<T>来获得IOC容器中的bean实例 需要保证配置的目标类型唯一
//不需要强转,在函数内部根据Class<T>转换成目标类型
<T> T getBean(Class<T> requiredType) throws BeansException;
//根据bean的名称和指定显式构造函数 参数 获取目标bean
Object getBean(String name, Object... args) throws BeansException;
//根据bean的名称和指定显式构造函数 参数类型 获取目标bean
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//根据bean的名称,判断是否已经包含该bean
boolean containsBean(String name);
//根据bean的名称,判断该bean的实例是否为单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//根据bean的名称,判断该bean的实例是否为多例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
//检查给定名称的bean是否与指定的类型匹配
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//获取给定名称的bean的class
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//返回给定bean名称的别名,如果有的话。
String[] getAliases(String name);
}
BeanFactory只是定义了IOC容器的基本行为,具体的实现还是要依赖它的子类,Spring有很多IOC容器的实现,下面是它的继承体系。
图一:BeanDefinition的继承体系(图片取自网络)
在这些实现中其中一个典型的的就是XmlBeanFactory,XmlBeanFactory的实现原理就是读取XML中定义的信息,封装成BeanDefinition类,再注册到IOC容器中。
BeanFactory还有一个子接口ApplicationContext对它的功能进行了增强,是Spring提供的一个高级IOC容器,再完成IOC容器的基本功能之外,还通过继承接口实现了
1、支持信息源和国际化(继承MessageSource接口);
2、访问资源(继承ResourcePatternResolver);
3、支持应用事件(继承ApplicationEventPublisher)
简单的比较两者就是,XmlBeanFactory是普通版,ApplicationContext是高配版。
BeanDefinition(接口)
Spring IOC容器通过BeanDefinition的实现类对bean之间的关系进行了封装。
由于Spring要支持bean之间灵活性和拓展性,所有导致了Bean的解析过程异常复杂,功能也划分得很细,继承体系也比较复杂。
图二:BeanDefinition的继承体系