5.Spring

         前面已经对 ClassPathXmlApplicationContext 构造函数及设置资源配置路径做了解析,回顾之前的源码。

public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {
    private Resource[] configResources;//资源数组
    public ClassPathXmlApplicationContext(
            String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
            throws BeansException {
        //调用父类构造函数,进行相关对象创建,包括 Environment 对象的创建
        super(parent);
        //设置资源配置路径
        setConfigLocations(configLocations);
        if (refresh) {
            //执行刷新,整个IOC 容器启动的核心
            refresh();
        }
    }
}

        接着来看 Spring 源码的核心执行流程 refresh。 

public abstract class AbstractApplicationContext extends DefaultResourceLoader
        implements ConfigurableApplicationContext {
    @Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            //刷新前准备
            prepareRefresh();
            //创建容器对象DefaultListableBeanFactory,有两个重要的接口,ListableBeanFactory和ConfigurableBeanFactory。
            //加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition。
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
            //对Bean工厂的各种初始化操作
            prepareBeanFactory(beanFactory);
            try {
                //模板方法,扩展实现,子类覆盖方法做额外处理
                postProcessBeanFactory(beanFactory);
                //实例化并且执行BeanFactoryPostProcessor(BFPP),必须在实例化之前调用,调用各种 beanFactory 处理器
                invokeBeanFactoryPostProcessors(beanFactory);
                //实例化并且注册所有的BeanPostProcessor,以及监听器
                registerBeanPostProcessors(beanFactory);
                //为上下文初始化 message 源。
                initMessageSource();
                //初始化应用消息广播器。
                initApplicationEventMulticaster();
                //模板方法,用于扩展
                onRefresh();
                //注册监听器
                registerListeners();
                //实例化所有非懒加载的单例
                finishBeanFactoryInitialization(beanFactory);
                //完成整体刷新
                finishRefresh();
            } catch (BeansException ex) {
                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();
                // Reset 'active' flag.
                cancelRefresh(ex);
                // Propagate exception to caller.
                throw ex;
            } finally {
                // 重置缓存
                resetCommonCaches();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值