zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Spring 源码探索 - IOC 容器 - 架构设计(一)

2023-04-18 15:00:46 时间

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各种配置。

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

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

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

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

系列文章