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

#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();
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不断尝试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值