spring容器的refresh方法分析
从这里进去:
进入到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方法分析相关推荐
- 解读Spring容器的refresh()
Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理; 1).initPropertySources()初始化一些属性设置;子类自定义个性化的 ...
- Spring refresh 方法分析之一
三哥 内容来自[自学星球] 欢迎大家来了解我的星球,和星主(也就是我)一起学习 Java ,深入 Java 体系中的所有技术.我给自己定的时间是一年,无论结果如何,必定能给星球中的各位带来点东西. 想 ...
- Spring IOC流程源码分析
一.Spring 核心容器 IOC初始化过程 Spring 核心之 IOC 容器初体验 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里 ...
- spring系列-注解驱动原理及源码-spring容器创建流程
目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...
- Spring容器创建过程
Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理; 1).initPropertySources()初始化一些属性设置;子类自定义个性化的 ...
- Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题
文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...
- Spring容器创建流程(2)创建beanFactory,加载BeanDefinition
Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...
- Spring实战 | 番外篇: 搭建Spring环境实现helloworld、Bean配置、Spring容器
一.IntelliJ IDEA搭建Spring环境,实现helloworld 二.spring简介 三.配置形式 四.bean的配置方式 五.IOC和DI 六.在Spring的IOC容器里配置bean ...
- 雷丰阳雷神对spring容器的源码剖析
Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理;1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方 ...
- Spring:Spring容器(BeanFactory和ApplicationContext)
Spring的IoC容器是一个提供IoC支持的轻量级容器,IoC容器为管理对象之间的依赖关系提供了基础功能.Spring为我们提供了两种容器:BeanFactory和ApplicationContex ...
最新文章
- hbase过滤器查询
- 如何在Windows 10上跳过回收站以删除文件
- bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较
- pytorch学习笔记(三十四):MiniBatch-SGD
- PCL之统计异常值去除滤波器--StatisticalOutlierRemoval
- Oracle 补丁体系 及 opatch 工具 介绍
- apache 版本_Apache官宣!ShardingSphere首个Apache版本发布
- 如何理解“KISS 原则”?
- SWIFT IOS开发 部分compile error
- 修心三不:不生气不计较不抱怨
- linux脚本while死循环,shell编程之while死循环
- Spark的基本工作流程
- 在win10系统中安装多个不同版本的python环境
- 微信支付宝免签约支付方案
- python 可视化 皮肤_为什么我不建议你轻易入Python的“坑”?
- 如何使用 LK 字幕脚本工具
- 论文阅读技巧之三遍法
- 用JS控制SVG的预设动画
- 汽车行业大数据共享jt808/gps的开放性
- 阿里P5-基础知识2
热门文章
- 3.5 Python 实例4-文本进度条
- 细说自动筛选和高级筛选通过VBA快速文本筛选
- 安知我不知死之乐”的意境
- ROS-Control专题:PR2的六个概念【5】
- xshell 快捷键
- 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
- 微信小程序连接onenet控制RGB三色灯
- 游戏的现实规则和非现实规则
- 天牛须和贪心算法_天牛须算法
- 公司来了一个low逼程序员,进程线程面试题总结