Spring Boot 的启动原理是什么?

本文详细探讨了Spring Boot的启动过程,包括Spring启动顺序、扩展点、启动时的各种事件监听,以及源码级别的分析。重点强调了理解Spring启动原理对于避免线上故障的重要性,并给出了在何时启动Rpc、Http、MQ等入口流量的最佳实践。
摘要由CSDN通过智能技术生成

虽然Java程序员大部分工作都是CRUD,但是工作中常用的中间件必须和Spring集成,如果不知道Spring的原理,很难理解这些中间件和框架的原理。

一张长图透彻解释 Spring启动顺序

图片

图片

测试对Spring启动原理的理解程度

我举个例子,测试一下,你对Spring启动原理的理解程度。

  • Rpc框架和Spring的集成问题。Rpc框架何时注册暴露服务,在哪个Spring扩展点注册呢?init-method 中行不行?

  • MQ 消费组和Spring的集成问题。MQ消费者何时开始消费,在哪个Spring扩展点”注册“自己?init-method 中行不行?

  • SpringBoot 集成Tomcat问题。如果出现已开启Http流量,Spring还未启动完成,怎么办?Tomcat何时开启端口,对外服务?

SpringBoot项目常见的流量入口无外乎 Rpc、Http、MQ 三种方式。一名合格的架构师必须精通服务的入口流量何时开启,如何正确开启?最近我遇到的两次线上故障都和Spring启动过程相关。

故障的具体表现是:Kafka消费组已经开始消费,已开启流量,然而Spring 还未启动完成。因为业务代码中使用的Spring Event事件订阅组件还未启动(订阅者还未注册到Spring),所以处理异常,出了线上故障。根本原因是————项目在错误的时机开启 MQ 流量,然而Spring还未启动完成,导致出现故障。

正确的做法是:项目在Spring启动完成后开启入口流量,然而我司的Kafka消费组 在Spring init-method bean 实例化阶段就开启了流量,导致故障发生。出现这样的问题,说明项目初期的程序员没有深入理解Spring的启动原理。

接下来,我再次抛出 11 个问题,说明这个问题————深入理解Spring启动原理的重要性。

  1. Spring还未完全启动,在 PostConstruct 中调用 getBeanByAnnotation 能否获得准确的结果?

  2. 项目应该如何监听 Spring 的启动就绪事件?

  3. 项目如何监听Spring 刷新事件?

  4. Spring就绪事件和刷新事件的执行顺序和区别?

  5. Http 流量入口何时启动完成?

  6. 项目中在 init-method 方法中注册 Rpc 是否合理?什么是合理的时机?

  7. 项目中在 init-method 方法中注册 MQ 消费组是否合理?什么是合理的时机?

  8. PostConstruct 中方法依赖ApplicationContextAware拿到 ApplicationContext,两者的顺序谁先谁后?是否会出现空指针!

  9. init-methodPostConstructafterPropertiesSet 三个方法的执行顺序?

  10. 有两个 Bean声明了初始化方法。A使用 PostConstruct注解声明,B使用 init-method 声明。Spring一定先执行 A 的PostConstruct 方法吗?

  11. Spring 何时装配Autowire属性,PostConstruct 方法中引用 Autowired 字段什么场景会空指针?

精通Spring 启动原理,以上问题则迎刃而解。接下来,大家一起学习Spring的启动原理,看看Spring的扩展点分别在何时执行。

一起数数 Spring启动过程的扩展点有几个?

Spring的扩展点极多,这里为了讲清楚启动原理,所以只列举和启动过程有关的扩展点。

  1. BeanFactoryAware 可在Bean 中获取 BeanFactory 实例

  2. ApplicationContextAware 可在Bean 中获取 ApplicationContext 实例

  3. BeanNameAware 可以在Bean中得到它在IOC容器中的Bean的实例的名字。

  4. ApplicationListener 可监听 ContextRefreshedEvent等。

  5. CommandLineRunner 整个项目启动完毕后ÿ

Spring Boot启动原理可以分为以下几个步骤: 1. 加载并解析Spring Boot的配置文件:Spring Boot会首先加载并解析classpath下的application.properties或application.yml文件,将其中的配置项解析为Spring Boot内部的配置属性。 2. 创建并启动Spring应用上下文:Spring Boot会创建一个Spring应用上下文,加载应用中的所有bean,并为它们自动配置所需的依赖关系。Spring Boot提供了很多自动配置的starter模块,可以根据应用所需的功能,自动配置相关的bean和依赖。 3. 执行Spring Boot的自动配置:Spring Boot会根据classpath中的jar包和配置文件中的属性,自动配置应用所需的bean和依赖关系。这些自动配置是通过Spring Boot的条件注解实现的,只有在满足特定条件的情况下才会被执行。 4. 启动Spring MVC:如果应用中包含Spring MVC相关的jar包,Spring Boot会自动配置并启动Spring MVC框架,同时会自动配置一些常用的MVC组件,如ViewResolver、HandlerMapping等。 5. 启动内嵌的Web服务器:Spring Boot支持内嵌的Web服务器,如Tomcat、Jetty等。在启动Spring Boot应用时,会根据配置文件中的属性,自动配置并启动内嵌的Web服务器,同时将Spring应用上下文注册到Web服务器中。 总的来说,Spring Boot启动原理是通过自动化配置和条件注解,根据应用所需的功能,自动配置相关的bean和依赖关系,并启动内嵌的Web服务器。这种方式可以大大简化应用的开发和部署,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘世中-迷途小书童

欢迎IT从业者的头脑风暴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值