Spring-IOC源码深度解析

41次阅读

共计 1409 个字符,预计需要花费 4 分钟才能阅读完成。

IOC 的核心就是代码入口就在 AbstractApplictionContext

    public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {
            // 在刷新容器前进行一些准备工作,例如设置容器的激活状态,校验容器环境所必须的启动参数
            prepareRefresh();

            // 刷新内部的 BeanFactory,获得一个新鲜的 BeanFactory,这里面主要是读取 XML 文件,将其转换为 BeanDefinition
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // 对 BeanFactory 进行进一步的完善,包括注册应用上下文感知以及监听器感知的 BeanPostProcessor,// 先注册一些系统的环境 Bean
            prepareBeanFactory(beanFactory);

            try {
                // 给子类在初始化 BeanFactory 重写修改变动 beanFactory 的权利
                postProcessBeanFactory(beanFactory);

                // 调用 BeanFactoryPostProcessor,可以修改 beanFactory,与上面不同的是,这里是类似插件的形式,耦合度更低
                invokeBeanFactoryPostProcessors(beanFactory);

                // 提前注册 BeanPostProcessor,用于后期提供代理等功能
                registerBeanPostProcessors(beanFactory);

                // 初始化消息源,用于国际化
                initMessageSource();

                // 初始化应用事件广播器,用于广播应用上下文事件
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // 为应用事件广播器初始化监听器 (ApplicationListener)
                registerListeners();

                // 实例化并注册所有非懒加载的 bean
                finishBeanFactoryInitialization(beanFactory);

                // 刷新容器后的额外工作,初始化生命周期执行器,发布容器刷新完毕的应用上下文事件
                finishRefresh();}

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

                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // 清除掉不再需要的缓存,节省空间
                resetCommonCaches();}
        }
    }

未完待续。。。

正文完
 0