Spring源码分析之从refresh方法分析Spring的IoC原理


写在前面

Spring Bean 描述了一个 bean 的生命周期,那么这些生命周期中的方法是什么时候执行调用的呢?

refresh() 方法在 ConfigurableApplicationContext 接口中定义,而具体的实现是在 AbstractApplicationContext 中。
refresh() 方法是一个启动方法,调用该方法后,会实例化所有单例以及非单例的对象。

而通过 refresh() ,可以学习到 Spring 是如何初始化 bean 的,分析过程如下:

  1. 怎么处理BeanPostProcessor
  2. 怎么处理InitializingBean
  3. 怎么处理DisposableBean
  4. 怎么处理init-method

refresh

我们先来看看 refresh() :

		public void refresh() throws BeansException, IllegalStateException {
   
	        synchronized(this.startupShutdownMonitor) {
   
	        	//刷新加载之前的上下文
	            this.prepareRefresh();
	            //告诉子类刷新内部bean工厂
	            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
	            //准备在上下文中使用的 bean 工厂
	            this.prepareBeanFactory(beanFactory);
	
	            try {
   
	            	//允许上下文的子类去执行postProcessor
	                this.postProcessBeanFactory(beanFactory);
	                // 开始执行注册到该上下文的BeanFactoryPostProcessors
	                this.invokeBeanFactoryPostProcessors(beanFactory);
	                // 开始注册BeanPostProcessor来拦截其他的bean的初始化过程
	                this.registerBeanPostProcessors(beanFactory);
	                //初始化上下文的消息源
	                this.initMessageSource();
	                //初始化上下文的事件传播器
	                this.initApplicationEventMulticaster();
	                //在特定上下文子类中初始化其他特殊bean
	                this.onRefresh();
	                //检查监听器bean并注册
	                this.registerListeners();
	                //实例化所有剩余的单例
	                this.finishBeanFactoryInitialization(beanFactory);
	                //发布相应的事件
	                this.finishRefresh();
	            } catch (BeansException var9) {
   
	                if (this.logger.isWarnEnabled()) {
   
	                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
	                }
	
	                this.destroyBeans();
	                this.cancelRefresh(var9);
	                throw var9;
	            } finally 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值