美文网首页spring frameworkJava 核心技术编程语言爱好者
Spring IOC源码解析一:IOC初始化大致流程以及重要角色

Spring IOC源码解析一:IOC初始化大致流程以及重要角色

作者: 蓝梅 | 来源:发表于2021-06-26 13:23 被阅读0次

一、前言

分析Spring源码我们不需要太过于纠结细节,不然,这个源码最起码得分析几个月才能分析完;我们最主要的目的是分析整个容器初始化过程,怎么初始化bean,怎么设置动态代理;我们主要学习的是他们的思想,以及代码中运用到的设计模式;

二、源码中重要的角色

BeanFactory:用于访问容器中bean的接口,使用的是工厂模式,我们这次学习中,重点注意DefaultListableBeanFactory
BeanDefinition:BeanDefinition是bean在Spring中的描述,先读取到bean的各种元素,然后利用BeanDefinition去初始化bean
BeanDefinitionRegistry接口:注册bean定义到Spring容器中
BeanFactoryPostProcessor接口:bean工厂的后置处理器,该接口的作用主要是提供扩展点,用于各种bean定义的注册,我们主要关注ConfigurationClassPostProcessor该类;
BeanPostProcessor接口:bean的后置处理器,该接口提供的扩展点,用于初始化bean,以及初始化完成后的各种扩展;

三、IOC容器初始化的大致流程

其实IOC主要流程就是先读取BeanDefinition放到容器中,然后根据BeanDefinition去初始化bean,然后提供后置处理器作为扩展,来实现各种不同的功能;我们来看看,Spring IOC容器初始化大致的一个流程,主要是看AnnotationConfigApplicationContext和refresh,其他的细节,我们留到下个章节细讲

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
    //初始化容器,创建bean工厂,加载各种内部重要类的bean定义,用于初始化我们或者其他引入类
    this();
    //注册我们配置类的bean定义,初始化容器,从这个类开始
    register(componentClasses);
    //准备工作做好后,开始初始化容器
    refresh();
}
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        //设置容器状态,准备刷新容器
        prepareRefresh();
        //获取到容器的bean工厂
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
        //填充bean工厂的各种属性
        prepareBeanFactory(beanFactory);

        try {
            //留给子类实现,我们看的AnnotationConfigApplicationContext继承了GenericApplicationContext,该类主要是注册了ServletContextAwareProcessor
            postProcessBeanFactory(beanFactory);
            //主要是调用bean工厂的后置处理器,把我们的类,注册成bean定义
            invokeBeanFactoryPostProcessors(beanFactory);
            //注册bean的后置处理器
            registerBeanPostProcessors(beanFactory);
            //初始化国际化资源(这个方法不重要)
            initMessageSource();
            //Spring事件相关,主要是创建一个事件多播器
            initApplicationEventMulticaster();
            //留给子类实现
            onRefresh();
            //把我们的事件注册到容器中
            registerListeners();
            //实例化我们需要的bean,放入IOC容器
            finishBeanFactoryInitialization(beanFactory);
            //完成容器IOC容器初始化,并且发布初始化完成事件
            finishRefresh();
        }

        catch (BeansException ex) {
            if (logger.isWarnEnabled()) {
                logger.warn("Exception encountered during context initialization - " +
                        "cancelling refresh attempt: " + ex);
            }

            destroyBeans();

            cancelRefresh(ex);

            throw ex;
        }

        finally {
            resetCommonCaches();
        }
    }
}

我们先对这个过程有个了解,然后清楚里面的一些重要角色,下一节,我们再来一起过源码

相关文章

网友评论

    本文标题:Spring IOC源码解析一:IOC初始化大致流程以及重要角色

    本文链接:https://www.haomeiwen.com/subject/qntzyltx.html