从这里进去:

进入到refresh方法中,有10几个子方法,一个个讲。

1.prepareRefresh,刷新前的准备工作,比如:设置容器启动时间,设置活跃状态为true,设置关闭状态为false,获取environment对象,并加载当前的属性值到environment对象中,准备监听器和事件的集合对象,默认为空的集合。

2.obtainFreshBeanFactory,主要是创建容器对象(DefaultListableBeanFactory),生成BeanDefination,这个时候DefaultListableBeanFactory中的beanDefinationMap和beanDefinationName当中会有值。这里会进行xml文件解析,bean标签解析,创建beanDefination对象。

在loadBeanDefinitions方法中主要是读取本地文件库(dtd,xsd),解析xml文件,并完成beanDefination的加载。

解析的过程还是比较复杂的。大概的意思就是通过spring.schemas下的xsd所对应的解析类去解析xml标签,比如说解析标签,解析完bean标签生成BeanDefination对象,并设置到beanFactory中的beanDefinationMap和beanDefinationNames中。

3.prepareBeanFactory(beanFactory),创建了beanfactory,但它当中很多属性都是为null,所以这个方法主要是对beanFactory属性进行填充。

4.postProcessBeanFactory(beanFactory),对bean工厂进行一些处理,比如添加beanFactoryPostProcess,由具体的子类去实现。

5.invokeBeanFactoryPostProcessors(beanFactory),调用执行各种beanFactory后置处理器。

6.registerBeanPostProcessors(beanFactory),注册BeanPostProcessor,只注册,不调用,等初始化的时候再调用。

7.initMessageSource,初始化MessageSource组件(做国际化功能;消息绑定,消息解析),这个接口提供了消息处理功能。主要用于国际化/i18n。

8.initApplicationEventMulticaster,多播器:方便后面发布监听事件。在Spring容器中初始化事件广播器,事件广播器用于事件的发布。程序首先会检查bean工厂中是否有bean的名字和这个常量(applicationEventMulticaster)相同的,如果没有则说明没有那么就使用默认的ApplicationEventMulticaster 的实现:SimpleApplicationEventMulticaster。

9.onRefresh,子类去实现。一个模板方法,不同的Spring容器做不同的事情。比如web程序的容器ServletWebServerApplicationContext中会调用createWebServer方法去创建内置的Servlet容器。目前SpringBoot只支持3种内置的Servlet容器:
1.Tomcat
2.Jetty
3.Undertow

10.registerListeners,注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器

11.finishBeanFactoryInitialization(beanFactory),实例化剩下的(非懒加载)单例。循环beanDefinationNames,通过beanName从BeanDefinationMap中拿到beanDefination,实例化bean的时候,我们先调用getBean(beanName)方法,从缓存中查,看缓存中有没有,如果没有,我们则要doCreateBean,doCreateBean通过反射调用bean的构造方法创建出bean,创建出来以后会放入到三级缓存当中,然后填充属性populateBean,填充完以后调用initializeBean方法初始化,这个方法里面看你是否实现了Aware接口,如果实现了就执行Aware接口方法,然后调用BeanPostProcessor:postProcessBeforeInitialization方法,接着执行init方法,然后再调用BeanPostProcessor:postProcessAfterInitialization方法,完成初始化,然后返回对象实例,把它设置到一级缓存当中。


12.finishRefresh,完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)。
1.初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
2.调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
3.发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作

spring容器的refresh方法分析相关推荐

  1. 解读Spring容器的refresh()

    Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理;     1).initPropertySources()初始化一些属性设置;子类自定义个性化的 ...

  2. Spring refresh 方法分析之一

    三哥 内容来自[自学星球] 欢迎大家来了解我的星球,和星主(也就是我)一起学习 Java ,深入 Java 体系中的所有技术.我给自己定的时间是一年,无论结果如何,必定能给星球中的各位带来点东西. 想 ...

  3. Spring IOC流程源码分析

    一.Spring 核心容器 IOC初始化过程 Spring 核心之 IOC 容器初体验 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里 ...

  4. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  5. Spring容器创建过程

    Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理;     1).initPropertySources()初始化一些属性设置;子类自定义个性化的 ...

  6. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

    文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...

  7. Spring容器创建流程(2)创建beanFactory,加载BeanDefinition

    Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...

  8. Spring实战 | 番外篇: 搭建Spring环境实现helloworld、Bean配置、Spring容器

    一.IntelliJ IDEA搭建Spring环境,实现helloworld 二.spring简介 三.配置形式 四.bean的配置方式 五.IOC和DI 六.在Spring的IOC容器里配置bean ...

  9. 雷丰阳雷神对spring容器的源码剖析

    Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理;1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方 ...

  10. Spring:Spring容器(BeanFactory和ApplicationContext)

    Spring的IoC容器是一个提供IoC支持的轻量级容器,IoC容器为管理对象之间的依赖关系提供了基础功能.Spring为我们提供了两种容器:BeanFactory和ApplicationContex ...

最新文章

  1. hbase过滤器查询
  2. 如何在Windows 10上跳过回收站以删除文件
  3. bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较
  4. pytorch学习笔记(三十四):MiniBatch-SGD
  5. PCL之统计异常值去除滤波器--StatisticalOutlierRemoval
  6. Oracle 补丁体系 及 opatch 工具 介绍
  7. apache 版本_Apache官宣!ShardingSphere首个Apache版本发布
  8. 如何理解“KISS 原则”?
  9. SWIFT IOS开发 部分compile error
  10. 修心三不:不生气不计较不抱怨
  11. linux脚本while死循环,shell编程之while死循环
  12. Spark的基本工作流程
  13. 在win10系统中安装多个不同版本的python环境
  14. 微信支付宝免签约支付方案
  15. python 可视化 皮肤_为什么我不建议你轻易入Python的“坑”?
  16. 如何使用 LK 字幕脚本工具
  17. 论文阅读技巧之三遍法
  18. 用JS控制SVG的预设动画
  19. 汽车行业大数据共享jt808/gps的开放性
  20. 阿里P5-基础知识2

热门文章

  1. 3.5 Python 实例4-文本进度条
  2. 细说自动筛选和高级筛选通过VBA快速文本筛选
  3. 安知我不知死之乐”的意境
  4. ROS-Control专题:PR2的六个概念【5】
  5. xshell 快捷键
  6. 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
  7. 微信小程序连接onenet控制RGB三色灯
  8. 游戏的现实规则和非现实规则
  9. 天牛须和贪心算法_天牛须算法
  10. 公司来了一个low逼程序员,进程线程面试题总结