程序员技术交流

spring源码探索(0)-IOC容器-架构设计

2018-07-12  本文已影响31人  青芒v5

IOC的容器设计

IOC容器接口设计图

主要两条主线

BeanFactory

一条是以BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory。BeanFactory作为IOC容器的基本实现,譬如getBean() 可以从容器中拿到对应bean。而HierarchicalBeanFactory 则增加了getParentBeanFactory()可以获取父级容器。ConfigurableBeanFactory定义了一些配置功能。总起来我们可以把这条线定义为IOC容器的基本实现。

ApplicationContext

第二条是以ApplicationContext为核心的的接口设计。其下游接口ConfigurableApplicationContext 和 WebApplicationContext。相比BeanFactory则是IOC容器的更高级实现。

开发中,我们接触最多的,应该就是ApplicationContext。
1.访问资源多样化支持file路径、class路径等
2.支持应用事件。 由于继承了ApplicationEventPublisher,事件和生命周期的结合为Bean的管理提供了便利
3.提供很多的附加功能,使得IOC容器的功能更为丰富,相比BeanFactory它的使用是面向框架的风格。

ApplicationContext 的具体实现

以FileSystemXmlApplicationContext为例,ApplicationContext的具体实现大部分在FileSystemXmlApplicationContext的基类AbstractXmlApplicationContext中实现,我们看下使用姿势

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("/"+"/code/spring-study/target/classes/applicationContext-test.xml");
        context.getBean("helloWorldService");

具体执行的FileSystemXmlApplicationContext构造方法

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
            throws BeansException {

    super(parent);
    setConfigLocations(configLocations);
    if (refresh) {
        refresh();
    }
}

其中核心部分就是 refresh(),它承担这IOC容器启动的一系列操作,后续会逐步分析。

IOC容器启动步骤

IOC容器,我们可以简单的任务它就是一个水桶,而BeanDefinition就是里面的水。BeanDefinition包含了spring应用中各对象属性以及对象间的相互依赖关系,看下图,里面有些属性大家都很熟悉了,就是我们在xml里定义的bean各种配置。


BeanDefinition 属性部分截图

有了这些基础数据,容器才能发挥作用。

IOC容器初始化顺序大致分为下面三个部分,后续的代码分析也是基于这三块依次展开
1.Resource定位
这个主要是指BeanDefinition资源的定位,或者我们就简单的认为我们的配置文件定位

2.BeanDefinition载入
将用户定义好的bean信息转化成BeanDefinition的形式,存储到内存中

3.注册BeanDefinition
向IOC容器注册BeanDefinition


系列文章
spring源码探索(0)-IOC容器-架构设计
spring源码探索(1)-IOC容器-Resource
spring源码探索(2)-IOC容器-BeanDefinition加载与注册
spring源码探索(3)-IOC容器-Bean的一生
spring源码探索(4)-AOP实现原理

上一篇下一篇

猜你喜欢

热点阅读