Spring源码分析第一集,IOC容器加载

计算机软件开发 2024-10-5 09:56:20 26 0 来自 中国
IOC容器介绍以及容器加载-当前只是简朴对IOC参加的流程以及具体方法举行阐明。后面增补每个方法的源码分析

在spring中,容器可以分为两大类。


  • 一类是由BeanFactory接口界说的焦点容器,其基本的实现类为DefaultListableBaenFactory,之以是被称为焦点容器,就是由于它实现了容器的焦点功能,Bean的依赖注入以及生命周期的管理
  • 一类是由ApplicationContext接口界说的容器,也就是上下文。内部持有一个BeanFactory对象,它在BeanFactory上举行了拓展。比方国际化支持、变乱监听、在开辟中常常用到。
IOC启动流程

ClassPathXmlApplicationContext 入口
在利用ClassPathXmlApplicationContext构建IOC容器时,通常会转达设置文件。
public ClassPathXmlApplicationContext(            String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)            throws BeansException {        //转达上下文对象至父级容器        super(parent);        // 设置设置文件地址,期待后续创建容器时剖析        setConfigLocations(configLocations);        // 判定是否革新容器,默以为true        if (refresh) {            //开始构建并革新容器            refresh();        }    }由于ClassPathXmlApplicationContext继续了AbstractApplicationContext以是终极会调用到AbstractApplicationContextrefresh方法。开始构建并革新容器;refresh方法是整个IOC容器加载构建的最外层方法。
    @Override    public void refresh() throws BeansException, IllegalStateException {        synchronized (this.startupShutdownMonitor) {            StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");            // 设置启动时间,并设置当前容器为活动状态,以及初始化情况变量            prepareRefresh();            // 构建BeanFactory工程。并剖析之前设置的设置文件。天生BeanDefinition对象            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();            // 对BeanFactory工场的前置加强,内部            prepareBeanFactory(beanFactory);            try {                // 对BeanFactory工程的后置加强。该方法可由子类实现。                postProcessBeanFactory(beanFactory);                StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");                // 重要是对BeanDefinitionRegistryPostProcessor实例化,并运行postProcessBeanDefinitionRegistry与postProcessBeanFactory方法                invokeBeanFactoryPostProcessors(beanFactory);                // 重要是对BeanPostProcessors举行加强,但是不会答应其加强方法                registerBeanPostProcessors(beanFactory);                beanPostProcess.end();                // 初始化国际化                initMessageSource();                // 初始化spring变乱,默认利用SimpleApplicationEventMulticaster                initApplicationEventMulticaster();                // 扩展的一个实现 ,留给子类来初始化别的的Bean。如springboot内嵌的tomcat在这个阶段完成                onRefresh();                // 查询并注册以是的ApplicationListener到消息广播器中                registerListeners();                // 实例化全部的单例bean,在每个bean的实例化期间,都会调用前面注册的BeanPostProcess,举行前置后置加强                finishBeanFactoryInitialization(beanFactory);                // 发布相应的变乱。完成革新过程, 关照生命周期处现器lifecycleProcessor 革新过程, 同时发出ContextRefreshEvent 关照别人                finishRefresh();            }            catch (BeansException ex) {                if (logger.isWarnEnabled()) {                    logger.warn("Exception encountered during context initialization - " +                            "cancelling refresh attempt: " + ex);                }                // 烧毁以创建的Bean                destroyBeans();                // 取消refresh操纵,重置容器的同步标识                cancelRefresh(ex);                // Propagate exception to caller.                throw ex;            }            finally {                //重置Spring焦点中的常见缓存,由于后面不再需要单例bean的元数据也就是。。。                resetCommonCaches();                contextRefresh.end();            }        }    }
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-21 22:08, Processed in 0.171387 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表