SpringBoot源码核心源码讲解

this.mainApplicationClass = deduceMainApplicationClass();

}

在本方法中完成了几个核心操作

  1. 推断当前项目的类型

  2. 加载配置在spring.factories文件中的ApplicationContextInitializer中的类型并实例化后存储在了initializers中。

  3. 和2的步骤差不多,完成监听器的初始化操作,并将实例化的监听器对象存储在了listeners成员变量中

  4. 通过StackTrace反推main方法所在的Class对象

上面的核心操作具体的实现细节我们在后面的详细文章会给大家剖析

4.run方法


接下来我们在回到SpringApplication.run()方法中。

public ConfigurableApplicationContext run(String… args) {

// 创建一个任务执行观察器

StopWatch stopWatch = new StopWatch();

// 开始执行记录执行时间

stopWatch.start();

// 声明 ConfigurableApplicationContext 对象

ConfigurableApplicationContext context = null;

// 声明集合容器用来存储 SpringBootExceptionReporter 启动错误的回调接口

Collection exceptionReporters = new ArrayList<>();

// 设置了一个名为java.awt.headless的系统属性

// 其实是想设置该应用程序,即使没有检测到显示器,也允许其启动.

//对于服务器来说,是不需要显示器的,所以要这样设置.

configureHeadlessProperty();

// 获取 SpringApplicationRunListener 加载的是 EventPublishingRunListener

// 获取启动时到监听器

SpringApplicationRunListeners listeners = getRunListeners(args);

// 触发启动事件

listeners.starting();

try {

// 构造一个应用程序的参数持有类

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

// 创建并配置环境

ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);

// 配置需要忽略的BeanInfo信息

configureIgnoreBeanInfo(environment);

// 输出的Banner信息

Banner printedBanner = printBanner(environment);

// 创建应用上下文对象

context = createApplicationContext();

// 加载配置的启动异常处理器

exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,

new Class[] { ConfigurableApplicationContext.class }, context);

// 刷新前操作

prepareContext(context, environment, listeners, applicationArguments, printedBanner);

// 刷新应用上下文 完成Spring容器的初始化

refreshContext(context);

// 刷新后操作

afterRefresh(context, applicationArguments);

// 结束记录启动时间

stopWatch.stop();

if (this.logStartupInfo) {

new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);

}

// 事件广播 启动完成了

listeners.started(context);

callRunners(context, applicationArguments);

}

catch (Throwable ex) {

// 事件广播启动出错了

handleRunFailure(context, ex, exceptionReporters, listeners);

throw new IllegalStateException(ex);

}

try {

// 监听器运行中

listeners.running(context);

}

catch (Throwable ex) {

handleRunFailure(context, ex, exceptionReporters, null);

throw new IllegalStateException(ex);

}

// 返回上下文对象–> Spring容器对象

return context;

}

在这个方法中完成了SpringBoot项目启动的很多核心的操作,我们来总结下上面的步骤

  1. 创建了一个任务执行的观察器,统计启动的时间

  2. 声明ConfigurableApplicationContext对象

  3. 声明集合容器来存储SpringBootExceptionReporter即启动错误的回调接口

  4. 设置java.awt.headless的系统属性

  5. 获取我们之间初始化的监听器(EventPublishingRunListener),并触发starting事件

  6. 创建ApplicationArguments这是一个应用程序的参数持有类

  7. 创建ConfigurableEnvironment这时一个配置环境的对象

  8. 配置需要忽略的BeanInfo信息

  9. 配置Banner信息对象

  10. 创建对象的上下文对象

  11. 加载配置的启动异常的回调异常处理器

  12. 刷新应用上下文,本质就是完成Spring容器的初始化操作

  13. 启动结束记录启动耗时

  14. 完成对应的事件广播

  15. 返回应用上下文对象。
    到此SpringBoot项目的启动初始化的代码的主要流程就介绍完成了。细节部分后面详细讲解。
    请添加图片描述

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-TMvJdTd6-1714465015695)]

Mybatis面试专题

[外链图片转存中…(img-BHD8nhsY-1714465015696)]

MySQL面试专题

[外链图片转存中…(img-nIHyB70E-1714465015696)]

并发编程面试专题

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Springboot源码解析PDF是一本深入解析Springboot框架的技术书籍,涵盖了Springboot的背景、原理、设计思路、运行机制、开发实践等方面。全书主要分为三部分:第一部分介绍Springboot的基础知识,包括Spring框架的常用注解、Springboot的配置、自动配置原理等;第二部分深入探讨Springboot的主要功能,如数据访问、Web开发、缓存、消息、安全等;第三部分着重介绍开发Springboot应用的最佳实践,包括Springboot与其他框架的结合使用、集成测试、监控与诊断等。 阅读Springboot源码解析PDF可以让开发者更深入理解Springboot的设计理念、技术实现以及应用场景,在实际项目开发中更加灵活、高效地使用Springboot。该书对于有一定JavaSpring框架基础的开发者来说是一本非常优秀的参考资料,也是Java开发者必不可少的技术读物。同时,该书也是借助源码解析的方式,让读者更加系统化地学习Springboot技术,具有很高的实用性和参考价值。总之,阅读Springboot源码解析PDF有助于开发者更好地掌握Springboot技术,提高应用开发效率和代码质量。 ### 回答2: Spring Boot源码解析pdf是一本介绍Spring Boot框架的开源书籍,该书的目的是帮助开发者深入了解Spring Boot的内部工作原理和实现细节。 该书首先从Spring Boot框架的源码结构和核心模块入手,详细介绍了Spring Boot的MVC、ORM、缓存、安全等核心功能的实现原理。同时,该书还介绍了Spring Boot对微服务的支持和整合Spring Cloud的方式,让开发者更深入了解Spring Boot在分布式架构中的应用。 在讲解源码实现原理的同时,该书还指出了一些常见的开发问题和易错点,并提供了相应的解决方案。此外,该书还通过一系列的案例,全面展示了Spring Boot的实际开发应用场景,帮助开发者更好地应用Spring Boot框架。 总的来说,Spring Boot源码解析pdf是一本非常实用的书籍,能够帮助开发者快速掌握Spring Boot框架的内部实现原理,提高开发效率和代码质量。同时,该书还可以作为学习Spring Boot的参考资料,对于想要深入学习和研究Spring Boot的开发者来说是非常有用的。 ### 回答3: Spring Boot 是一个很受欢迎的 Java 框架,它简化了开发者的工作,允许他们更快速地构建和部署应用程序。Spring Boot 的优点包括简洁的配置、内嵌的 Web 容器和现成的插件,让开发者可以更专注于业务逻辑。Spring Boot源码解析是学习它的关键。 Spring Boot源码解析对Java初学者来说可能会比较复杂,但是它对于学习框架和原理是非常有益的。一个好的 Spring Boot 项目需要基于很好的基础,这就要求开发者了解其源码源码解析可以帮助开发者了解各种设计模式和组件的原理,有助于解决实际问题。 在 Spring Boot源码解析中,我们将会找到很多有用的信息。例如,我们可以看到 Spring Boot 如何通过注解处理器创建并配置 bean,这可以帮助我们更好地理解依赖注入和 IoC 容器。此外,我们还可以了解 Spring Boot 如何处理 HTTP 请求、创建模板、处理安全性等。这些知识可以帮助我们更好地理解 Spring Boot 内部的工作机制。 总之,Spring Boot源码解析是必不可少的一部分,它可以帮助开发者更好地了解和使用该框架,掌握在实践中所需的知识和技能。如果您是一名 Spring 开发者,那么深入了解 Spring Boot源码将会是一个很好的学习过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值