Spring IOC源码(一):IOC容器启动流程核心方法概览
1、ClassPatchXmlApplicationContext的类图结构

2、ClassPatchXmlApplicationContext构造器

1 public ClassPathXmlApplicationContext(
2 String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
3 throws BeansException {
4 // 调用父类构造方法
5 super(parent);
6 // 资源路径设置到当前上下文中
7 setConfigLocations(configLocations);
8 // 刷新容器
9 if (refresh) {
10 refresh();
11 }
12 }

2.1、调用父类构造器

1 // 构造器
2 public AbstractApplicationContext(@Nullable ApplicationContext parent) {
3 this();
4 setParent(parent);
5 }
6 // 初始化资源路径解析器
7 public AbstractApplicationContext() {
8 // 创建资源模式处理器
9 this.resourcePatternResolver = getResourcePatternResolver();
10 }
11 // 设置父容器
12 public void setParent(@Nullable ApplicationContext parent) {
13 this.parent = parent;
14 // 若父容器不为空,则将父容器的环境配置合并到当前容器中
15 if (parent != null) {
16 Environment parentEnvironment = parent.getEnvironment();
17 if (parentEnvironment instanceof ConfigurableEnvironment) {
18 getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
19 }
20 }
21 }

2.2、设置资源路径

1 // 设置资源路径
2 public void setConfigLocations(@Nullable String... locations) {
3 if (locations != null) {
4 Assert.noNullElements(locations, "Config locations must not be null");
5 this.configLocations = new String[locations.length];
6 for (int i = 0; i < locations.length; i++) {
7 this.configLocations[i] = resolvePath(locations[i]).trim();
8 }
9 }
10 else {
11 this.configLocations = null;
12 }
13 }

2.3、刷新容器 - Spring的IOC容器的核心启动流程

1 // 刷新容器的流程
2 @Override
3 public void refresh() throws BeansException, IllegalStateException {
4 synchronized (this.startupShutdownMonitor) {
5 // 容器刷新前的准备工作
6 prepareRefresh();
7 // 创建容器对象DefaultListableBeanFactory,加载xml配置文件的属性值到当前工厂中
8 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
9 // beanFactory的准备工作,对各种属性进行填充
10 prepareBeanFactory(beanFactory);
11
12 try {
13 // 子类覆盖方法做额外的处理,web中的代码有具体实现
14 postProcessBeanFactory(beanFactory);
15
16 // 调用各种beanFactory处理器
17 invokeBeanFactoryPostProcessors(beanFactory);
18
19 // 注册bean处理器,这里只是注册功能,真正调用的地方在getBean方法
20 registerBeanPostProcessors(beanFactory);
21
22 // 为上下文初始化message源,即不同语言的消息体,国际化处理,在springmvc的有实际应用
23 initMessageSource();
24
25 // 初始化事件监听多路广播器
26 initApplicationEventMulticaster();
27
28 // 留给子类来初始化其他的bean
29 onRefresh();
30
31 // 在所有注册的bean中查找listener bean,注册到消息广播器中
32 registerListeners();
33
34 // 初始化剩下的单实例(非懒加载的)
35 finishBeanFactoryInitialization(beanFactory);
36
37 // 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知
38 finishRefresh();
39 }
40
41 catch (BeansException ex) {
42 if (logger.isWarnEnabled()) {
43 logger.warn("Exception encountered during context initialization - " +
44 "cancelling refresh attempt: " + ex);
45 }
46
47 // 为防止bean资源占用,在异常处理中,销毁已经在前面过程中生成的单件bean
48 destroyBeans();
49
50 // 重置active标志
51 cancelRefresh(ex);
52
53 throw ex;
54 }
55 finally {
56 // 重置缓存
57 resetCommonCaches();
58 }
59 }
60 }

综上可见,Spring容器启动的核心方法,这些方法后序会做详细介绍
1、prepareRefresh()
2、obtainFreshBeanFactory()
3、prepareBeanFactory(beanFactory)
4、postProcessBeanFactory(beanFactory)
5、invokeBeanFactoryPostProcessors(beanFactory)
6、registerBeanPostProcessors(beanFactory)
7、finishBeanFactoryInitialization(beanFactory)
8、finishRefresh()
Spring IOC源码(一):IOC容器启动流程核心方法概览的更多相关文章
- Cocos2dx源码赏析(1)之启动流程与主循环
Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码.所谓,"源码之前,了无秘密".而笔者 ...
- JVM源码分析之JVM启动流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...
- Spring Ioc源码分析系列--容器实例化Bean的四种方法
Spring Ioc源码分析系列--实例化Bean的几种方法 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到bean真正通过那些方式实例化出来的时候,并没有继续分 ...
- 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- spring源码:web容器启动(li)
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
- spring源码:web容器启动
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
- Spring源码解析-Web容器启动过程
Web容器启动过程,主要讲解Servlet和Spring容器结合的内容. 流程图如下: Web容器启动的Root Context是有ContextLoaderListener,一般使用spring,都 ...
- sping ioc 源码分析(一)-- register(componentClasses) 方法
一.测试环境的搭建: public class Apple { } @Component public class MyComponet { } public class MyCondition im ...
- Fabric1.4源码解析: 链码容器启动过程
想写点东西记录一下最近看的一些Fabric源码,本文使用的是fabric1.4的版本,所以对于其他版本的fabric,内容可能会有所不同. 本文想针对Fabric中链码容器的启动过程进行源码的解析.这 ...
随机推荐
- 授予用户/用户组访问 Kubernetes 的一个名称空间
转载地址:https://www.kuboard.cn/learning/k8s-advanced/sec/rbac/auth-namespace.html 前提条件 已安装 Kuboard v3,版 ...
- shell脚本中执行source命令不生效的解决办法
一个shell脚本文件中有一个source命令,使用bash a.sh命令执行后source命令进行验证没有生效. 这是因为在shell脚本中执行source会看到效果,但是shell脚本执行完后再次 ...
- 8. 使用Fluentd+MongoDB采集Apache日志
Fluentd+MongoDB,用以实时收集半结构化数据. 背景知识 日志接入Fluentd后,会以json的格式在Fluentd内部进行路由.这就决定了Fluentd处理日志的方式是非常灵活的,它将 ...
- 从nuxt开始的SEO之路
故事从一个"美好"的早上开始...... 大清早的来到公司,打开电脑,emm, 还是熟悉的味道,鱼儿被我摸熟了的味道......就在开始准备一天的摸鱼之旅的时候,一种不详的预感涌上 ...
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
[点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...
- spring boot集成redis基础入门
redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...
- Docker | 容器数据卷详解
什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My ...
- 构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
1.构建SpringBoot项目 大致流程 1.新建工程 2.选择环境配置.jdk版本 3.选择 依赖(可省略.后续要手动在pom文件写) 4.项目名 1.1 图解建立过程 1.2 项目结构 友情提示 ...
- 教你用canvas打造一个炫酷的碎片切图效果
前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们的canvas来实现,代码量不多,但有些地方还是需要花点时间去理解的,需要点数 ...
- Vitepress搭建组件库文档(下)—— 组件 Demo
上文 <Vitepress搭建组件库文档(上)-- 基本配置>已经讨论了 vitepress 搭建组件库文档的基本配置,包括站点 Logo.名称.首页 home 布局.顶部导航.左侧导航等 ...