IOC体系结构
一、BeanFactory
- Spring Bean的创建是工厂模式
- 这一系列的Bean工厂(IOC容器)为开发者管理对象间的依赖关系提供了很多便利和基础服务。
1.1、为何要定义这么多层次的接口?
每个接口都有自己的使用场景,它主要是为了区分 对象传递和转化过程中,对对象的数据访问所做的限制。举例如下
1.1.1、ListableBeanFactory 接口
表示这些 Bean 是可列表的
1.1.2、HierarchicalBeanFactory 接口
表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。
1.1.3、AutowireCapableBeanFactory 接口
定义 Bean 的自动装配规则。
1.2、BeanFactory功能
- 它定义了IOC容器的基本功能规范
- BeanFactory 有三个子类
- ListableBeanFactory
- HierarchicalBeanFactory
- AutowireCapableBeanFactory
- 最终的默认实现类是:
- DefaultListableBeanFactory
1.3、BeanFactory源码
public interface BeanFactory {
// 对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
// 如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
// 根据bean的名字,获取在IOC容器中的bean实例
Object getBean(String name) throws BeansException;
// 根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
Object getBean(String name, Class requiredType) throws BeansException;
// 提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
// 根据bean名字得到bean实例,并同时判断这个bean是不是单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 得到bean实例的Class类型
Class getType(String name) throws NoSuchBeanDefinitionException;
// 得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
1.3.1、BeanFactory设计的目的
- 定义了IOC容器的bean的规范,类似于设计模式的模板模式。具体实现由具体的IOC容器去确认。
- spring提供了许多IOC容器的实现。比如XmlBeanFactory,ClasspathXmlApplicationContext等。
1.3.2、具体的IOC容器–XmlBeanFactory
- 是Spring提供的一个最基本的IOC容器
- 可以提供最基本功能。
- 可以读取XML文件定义的BeanDefinition(XML文件中对bean的描述)。
1.3.3、具体的IOC容器–ApplicationContext
- 是Spring提供的一个高级的IOC容器
- 可以提供IOC容器的基本功能
- 可以提供以下的附加服务。
- 支持信息源,可以实现国际化。(实现MessageSource接口)
- 访问资源。(实现ResourcePatternResolver接口)
- 支持应用事件。(实现ApplicationEventPublisher接口)
二、BeanDefinition
2.1、什么是BeanDefinition
- 是bean定义的最终文件,非常详细的描述了bean的信息。
- 通过BeanDefinition,我们可以获取bean的所有信息。包括和各个对象的依赖关系
2.2、 Bean 的解析
Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。所以就有很多bean的解析实现类。比如对xml的解析就通过XmlBeanDefinitionReader来完成。
其实上面的话套用设计模式的规则来讲就是,功能的调用都是使用接口。
2.2.1、XmlBeanDefinitionReader继承关系
|