三、refresh方法解析

代码:

public void refresh() throws BeansException, IllegalStateException {
		//上锁
		synchronized (this.startupShutdownMonitor) {
			//1、调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识
			prepareRefresh();

			//2、告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从子类的refreshBeanFactory()方法启动
			//(实例化一个DefaultListableBeanFactory,加载资源文件中(xml配置)的配置生成BeanDefinition)
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			//3、为BeanFactory配置容器特性,例如类加载器、事件处理器等
			prepareBeanFactory(beanFactory);

			try {

				//4、为容器的某些子类指定特殊的BeanPost事件处理器
				postProcessBeanFactory(beanFactory);


				//5、调用所有注册的BeanFactoryPostProcessor的Bean (会扫描注册bean到ioc容器)
				invokeBeanFactoryPostProcessors(beanFactory);


				//6、为BeanFactory注册BeanPostProcessors事件处理器. BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件
				registerBeanPostProcessors(beanFactory);

				//7、初始化信息源,和国际化相关.
				//initMessageSource()方法用来设置国际化资源相关的调用,将实现了MessageSource接口的bean存放
				// 在ApplicationContext的成员变量中,先看是否有此配置,如果有就实例化,否
				// 则就创建一个DelegatingMessageSource实例的bean
				initMessageSource();

				//8、初始化容器事件传播器.
				//多播器单独的作用不大,他需要与第10步的监听器,构成观察者模式,监听整个过程的触发的事件;
				initApplicationEventMulticaster();

				//9、调用子类的某些特殊Bean初始化方法
				onRefresh();

				//10、为事件传播器注册事件监听器.
				registerListeners();

				//11、初始化所有剩余的单例Bean 
				finishBeanFactoryInitialization(beanFactory);

				//12、初始化容器的生命周期事件处理器,并发布容器的生命周期事件
				finishRefresh();
			}

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

				//13、销毁已创建的Bean
				destroyBeans();

				//14、取消refresh操作,重置容器的同步标识。
				cancelRefresh(ex);

				// 将exception抛给调用者。
				throw ex;
			}

			finally {
				//15、重设公共缓存
				resetCommonCaches();
			}
		}
	}

里面重要的几个步骤是: 第2步会读取xml配置,第5步执行BeanFactoryPostProcessor,第6步注册BeanPostProcessors,第11步初始化剩余的单例bean。

下一章:四、obtainFreshBeanFactory方法解析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值