一张长图透彻理解 SpringBoot 启动原理,架构师必备知识,不为应付面试!

ruoyi-vue-pro 开发指南 - myself 快速启动(适合“后端”工程师) | ruoyi-vue-pro 开发指南 (iocoder.cn) 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

0798c9bc9139ce1aa9981b2edfbe8f11.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7308610896803659812


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

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

f05bef6ddf5049cda1af674faa649511.png

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

测试对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-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序?

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

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

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

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

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

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

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

  4. ApplicationListener 可监听 ContextRefreshedEvent等。

  5. CommandLineRunner 整个项目启动完毕后,自动执行

  6. SmartLifecycle#start 在Spring Bean实例化完成后,执行start 方法。

  7. 使用@PostConstruct注解,用于Bean实例初始化

  8. 实现InitializingBean接口,用于Bean实例初始化

  9. xml 中声明 init-method 方法,用于Bean实例初始化

  10. Configuration 配置类 通过@Bean注解 注册Bean到Spring

  11. BeanPostProcessor 在Bean的初始化前后,植入扩展点!

  12. BeanFactoryPostProcessor 在BeanFactory创建后植入 扩展点!

通过打印日志学习Spring的执行顺序

首先我们先通过 代码实验,验证一下以上扩展点的执行顺序。

1.声明 TestSpringOrder 分别继承以下接口,并且在接口方法实现中,日志打印该接口的名称。

public class TestSpringOrder implements
      ApplicationContextAware,
      BeanFactoryAware, 
      InitializingBean, 
      SmartLifecycle, 
      BeanNameAware, 
      ApplicationListener<ContextRefreshedEvent>, 
      CommandLineRunner,
      SmartInitializingSingleton {
@Override
public void afterPropertiesSet() throws Exception {
   log.error("启动顺序:afterPropertiesSet");
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
   log.error("启动顺序:setApplicationContext");
}

2.TestSpringOrder 使用 PostConstruct注解初始化,声明 init-method方法初始化。

@PostConstruct
public void postConstruct() {
   log.error("启动顺序:post-construct");
}

public void initMethod() {
   log.error("启动顺序:init-method");
}

3.新建 TestSpringOrder2 继承

public class TestSpringOrder3 implements
         BeanPostProcessor, 
         BeanFactoryPostProcessor {
   @Override
   public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      log.error("启动顺序:BeanPostProcessor postProcessBeforeInitialization beanName:{}", beanName);
      return bean;
   }

   @Override
   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      log.error("启动顺序:BeanPostProcessor postProcessAfterInitialization beanName:{}", beanName);
      return bean;
   }

   @Override
   public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
      log.error("启动顺序:BeanFactoryPostProcessor postProcessBeanFactory ");
   }
}

执行以上代码后,可以在日志中看到启动顺序!

实际的执行顺序
2023-11-25 18:10:53,748 [main] ERROR (TestSpringOrder3:37) - 启动顺序:BeanFactoryPostProcessor postProcessBeanFactory 
2023-11-25 18:10:59,299 [main] ERROR (TestSpringOrder:53) - 启动顺序:构造函数 TestSpringOrder
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder:127) - 启动顺序: Autowired
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder:129) - 启动顺序:setBeanName
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder:111) - 启动顺序:setBeanFactory
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder:121) - 启动顺序:setApplicationContext
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder3:25) - 启动顺序:BeanPostProcessor postProcessBeforeInitialization beanName:testSpringOrder
2023-11-25 18:10:59,316 [main] ERROR (TestSpringOrder:63) - 启动顺序:post-construct
2023-11-25 18:10:59,317 [main] ERROR (TestSpringOrder:116) - 启动顺序:afterPropertiesSet
2023-11-25 18:10:59,317 [main] ERROR (TestSpringOrder:46) - 启动顺序:init-method
2023-11-25 18:10:59,320 [main] ERROR (TestSpringOrder3:31) - 启动顺序:BeanPostProcessor postProcessAfterInitialization beanName:testSpringOrder
2023-11-25 18:17:21,563 [main] ERROR (SpringOrderConfiguartion:21) - 启动顺序: @Bean 注解方法执行
2023-11-25 18:17:21,668 [main] ERROR (TestSpringOrder:58) - 启动顺序:SmartInitializingSingleton
2023-11-25 18:17:21,675 [main] ERROR (TestSpringOrder:74) - 启动顺序:start
2023-11-25 18:17:23,508 [main] ERROR (TestSpringOrder:68) - 启动顺序:ContextRefreshedEvent
2023-11-25 18:17:23,574 [main] ERROR (TestSpringOrder:79) - 启动顺序:CommandLineRunner

我通过在以上扩展点 添加 debug 断点,调试代码,整理出 Spring启动原理的 长图。过程省略…………

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

bf74389b6f38a8fab80fe5110fc7ea7f.png
实例化和初始化的区别

new TestSpringOrder():new 创建对象实例,即为实例化一个对象;执行该Bean的 init-method 等方法 为初始化一个Bean。注意初始化和实例化的区别。

Spring 重要扩展点的启动顺序

1.BeanFactoryPostProcessor

BeanFactory初始化之后,所有的Bean定义已经被加载,但Bean实例还没被创建(不包括BeanFactoryPostProcessor类型)。Spring IoC容器允许BeanFactoryPostProcessor读取配置元数据,修改bean的定义,Bean的属性值等。

2.实例化Bean

Spring 调用java反射API 实例化 Bean。等同于 new TestSpringOrder();

3.Autowired 装配依赖

Autowired是 借助于 AutowiredAnnotationBeanPostProcessor 解析 Bean 的依赖,装配依赖。如果被依赖的Bean还未初始化,则先初始化 被依赖的Bean。在 Bean实例化完成后,Spring将首先装配Bean依赖的属性。

4.BeanNameAware

setBeanName

5.BeanFactoryAware

setBeanFactory

6.ApplicationContextAware setApplicationContext

在Bean实例化前,会率先设置Aware接口,例如 BeanNameAware BeanFactoryAware ApplicationContextAware 等

7.BeanPostProcessor postProcessBeforeInitialization

如果我想在 bean初始化方法前后要添加一些自己逻辑处理。可以提供 BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。在此接口中,可以创建Bean的代理,甚至替换这个Bean。

8.PostConstruct 执行

接下来 Spring会依次调用 Bean实例初始化的 三大方法。

9.InitializingBean

afterPropertiesSet

10.init-method

方法执行

11.BeanPostProcessor postProcessAfterInitialization

在 Spring 对Bean的初始化方法执行完成后,执行该方法

12.其他Bean 实例化和初始化

Spring 会循环初始化Bean。直至所有的单例Bean都完成初始化

13.所有单例Bean 初始化完成后

14.SmartInitializingSingleton Bean实例化后置处理

该接口的执行时机在 所有的单例Bean执行完成后。例如Spring 事件订阅机制的 EventListener注解,所有的订阅者 都是 在这个位置被注册进 Spring的。而在此之前,Spring Event订阅机制还未初始化完成。所以如果有 MQ、Rpc 入口流量在此之前开启,Spring Event就可能出问题!

所以强烈建议 Http、MQ、Rpc 入口流量在 SmartInitializingSingleton 之后开启流量。

Http、MQ、Rpc 入口流量必须在 SmartInitializingSingleton 之后开启流量。

15.Spring 提供的扩展点,在所有单例Bean的 EventListener等组件全部启动完成后,即Spring启动完成,则执行 start 方法。在这个位置适合开启入口流量!

Http、MQ、Rpc 入口流量适合 在 SmartLifecyle 中开启

16.发布 ContextRefreshedEvent 方法

该事件会执行多次,在 Spring Refresh 执行完成后,就会发布该事件!

17.注册和初始化 Spring MVC

SpringBoot 应用,在父级 Spring启动完成后,会尝试启动 内嵌式 tomcat容器。在此之前,SpringBoot会初始化 SpringMVC 和注册DispatcherServlet到Web容器。

18.Tomcat/Jetty 容器开启端口

SpringBoot 调用内嵌式容器,会开启并监听端口,此时Http流量就开启了。

19.应用启动完成后,执行 CommandLineRunner

SpringBoot 特有的机制,待所有的完全执行完成后,会执行该接口 run方法。值得一提的是,由于此时Http流量已经开启,如果此时进行本地缓存初始化、预热缓存等,稍微有些晚了!在这个间隔期,可能缓存还未就绪!

所以预热缓存的时机应该发生在 入口流量开启之前,比较合适的机会是在 Bean初始化的阶段。虽然 在Bean初始化时 Spring尚未完成启动,但是调用 Bean预热缓存也是可以的。但是注意:不要在 Bean初始化时 使用 Spring Event,因为它还未完成初始化 。

回答 关于 Spring 启动原理的若干问题

1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。

回答:PostConstruct,afterPropertiesSet,init-method

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

回答:Spring 会循环初始化Bean实例,初始化完成1个Bean,再初始化下一个Bean。Spring并没有使用这种机制启动,即所有的Bean先执行 PostConstruct,再统一执行afterProperfiesSet。

此外,A、B两个Bean的初始化顺序不确定,谁先谁后不确定。无法保证 A 的PostConstruct 一定先执行。除非使用 Order注解,声明Bean的初始化顺序!

3.Spring 何时装配Autowire属性,PostConstruct方法中引用 Autowired 字段是否会空指针?

Autowired装配依赖发生在 PostConstruct之前,不会出现空指针!

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

ApplicationContextAware 会先执行,不会出现空指针!但是当Autowired没有找到对应的依赖,并且声明了非强制依赖时,该字段会为空,有潜在 空指针风险。

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

通过SmartLifecyle start方法,监听Spring就绪 。适合在此开启入口流量!

6.项目如何监听Spring 刷新事件。

监听 Spring Event ContextRefreshedEvent

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

Spring就绪事件会先于 刷新事件。两者都可能多次执行,要确保方法的幂等处理,避免重复注册问题

8.Http 流量入口何时启动完成。

SpringBoot 最后阶段,启动完成Spring 上下文,才开启Http入口流量,此时 SmartLifecycle#start 已执行。所有单例Bean和SpringEvent等组件都已经就绪!

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

init 开启Rpc流量非常不合理。因为Spring尚未启动完成,包括 Spring Event尚未就绪!

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

init 开启 MQ 流量非常不合理。因为Spring尚未启动完成,包括 Spring Event尚未就绪!

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

虽然未启动完成,但是Spring执行该getBeanByAnnotation方法时,会率先检查 Bean定义,如果Bean定义对应的 Bean尚未初始化,则初始化这些Bean。所以即便是Spring初始化过程中调用,调用结果是准确的。

源码级别介绍

SmartInitializingSingleton 接口的执行位置

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行 SmartInitializingSingleton 接口。

22f69a6070a048554a7d116b0846610e.png
Autowired 何时装配Bean的依赖

在Bean实例化之后,但初始化之前,AutowiredAnnotationBeanPostProcessor 会注入Autowired字段。

e6a0eb01554cf304fb979a0d3c37c5af.png
SpringBoot 何时开启Http端口

下图代码中可以看到,SpringBoot会首先启动 Spring上下文,完成后才启动 嵌入式Web容器,初始化SpringMVC,监听端口

d003b06e1cb9f0f71498cabacb1f949b.png
Spring 初始化Bean的关键代码

下图我加了注释,Spring初始化Bean的关键代码,全在 这个方法里,感兴趣的可以自行查阅代码 。

AbstractAutowireCapableBeanFactory#initializeBean
eb854c354bb28e25eb19f7be49568626.png
Spring CommandLineRunner 执行位置

Spring Boot外部,当启动完Spring上下文以后,最后才启动 CommandLineRunner。

71349624b5f02acc9754872d37302054.png

总结

SpringBoot 会在Spring完全启动完成后,才开启Http流量。这给了我们启示:应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。

例如 Spring Cloud  Eureka 服务发现组件,就是在 SmartLifecype中注册服务的!

整理 10 个小时写完本篇文章,希望大家有所收获。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

ea92d8819959fd7b7271a4fc4ddcdc4d.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

2f3e5a2d68b897e0f87bcf8d45c193e5.png

f0484a85c5d5a6f04b2b8562395b3e2d.pngf00d8a40b1f138fc269ebb5587c2961a.png2053a7706533dd626039cad26e37b336.png29277ba72592b499c235fa1f4c14cc4b.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
SpringBoot启动流程 本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。 一、SpringBoot启动流程图 二、SpringBoot启动入口 @EnableScheduling @EnableAsync @SpringBootApplication @EnableAspectJAutoProxy @ComponentScan(basePackages = { "cn.gov.zcy.demand", "cn.gov.zcy. 阅读详情

相关推荐

SpringBoot原理-SpringBoot核心运行原理

导语   Spring Boot最为核心的功能就是自动配置,所有功能的实现都是基于“约定优于配置”的原则

初学者 6443

Spring Boot 启动过程与自动配置详解:从源码到实现

分析SpringBoot启动配置原理:给出整体初步分析和对应流程图,并从三方面进行展开分析(SpringApplication构造过程分析+SpringApplication启动过程分析+SpringBoot自动配置分析)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

一张长图透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试!

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行 SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。这给了我们启示:应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。

Cyufeng的博客 1136

java-springboot

Spring Boot使得创建独立的,基于生产级别的基于Spring的应用程序变得容易,您可以“运行”它们。大多数Spring Boot应用程序需要最少的Spring配置。SpringBoot其实就是构建Spring应用程序的“脚手架”,能够帮助我们快速的搭建一个Spring项目,并且尽可能减少XML的配置,做到“开箱即用”,让程序员只需要关注业务而不是配置!添加分页启动类</</</</在需要分页位置通过PageHelper.startPage(page,size)启动分页。

manyi8634的博客 4864

史上最全的Logisim运算器实验教程(基于华中科技大学计算机组成原理实验)

本博客是实现了Logisim的运算器设计,有具体的运算器设计的思路和运算器设计的电路,适合一步一步的按照思路做。

qq_62325622的博客 4万+

windows 下AD9361的 no-os master 工程搭建

参考网站: https://wiki.analog.com/resources/fpga/docs/build#windows_environment_setup https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/no-os-setup 参考博客: https://blog.youkuaiyun.com...

Bronceyang的博客 7294

18张图带你看懂SpringBoot解析yml全流程

前几天的时候,项目里有一个需求,需要一个开关控制代码中是否执行一段逻辑,于是理所当然的在yml文件中配置了一个属性作为开关,再配合nacos就可以随时改变这个值达到我们的目的,yml文件中是这样写的: switch: turnOn: on 程序中的代码也很简单,大致的逻辑就是下面这样,如果取到的开关字段是on的话,那么就执行if判断中的代码,否则就不执行: @Value("${switch.turnOn}") private String on; @GetMapping("...

Java4396的博客 1695

TwinCAT3 实时核异步通信:基于ADS的C++ Server/Client数据交换实战解析

本文深入解析了在TwinCAT3实时核中,如何利用ADS协议实现C++ Server与Client之间的异步数据交换。文章从核心概念入手,详细阐述了实时核、ADS通信及异步机制,并通过实战步骤指导环境搭建、路由配置、Server端服务创建与Client端请求发起,重点剖析了Req/Ind/Res/Con异步回调模型,旨在帮助开发者构建高效、非阻塞的实时工业控制应用。

purple的博客 469

SpringBoot启动过程探析-图解

m0_55796087的博客 193

MiniMAX H3官方SKILL三段式提示词模板与本地部署全解

视频生成模型的效果高度依赖于提示词的结构与质量,而提示词工程正是连接自然语言与视觉表达的关键桥梁。在文本模型之外,视频模型对场景、角色、镜头动作的信息层次更为敏感,普通自由描述往往导致画面漂移、风格不稳定。MiniMAX H3 作为社区热议的视频生成模型,通过一套官方 SKILL 三段式提示词模板,将环境、主体、镜头动作分类组织,免API、免推理即可稳定产出风格统一的素材。这一设计不仅降低了提示词编写门槛,也提升了多轮生成的复用性,适合短视频生产、影视概念设计及自动化视频流水线等场景。本文围绕该模板的结构与

weixin_33309048的博客 1178

Setup&Hold互卡问题和Useful Skew的影响

setup和hold互卡问题分析

godping的博客 5093

透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。例如 Spring Cloud Eureka 服务发现组件,就是在 SmartLifecype中注册服务的。

2401_89230798的博客 1021

Python 爬虫实战:爬取豆瓣电影 Top250 完整数据

本文基于Python技术实现了豆瓣电影Top250榜单数据的合规爬取与分析。针对豆瓣电影页面的分页结构、反爬机制等特点,采用requests库获取数据,结合BeautifulSoup解析HTML节点,并通过正则表达式提取电影名称、评分、导演等核心字段。爬虫实现了随机User-Agent、请求间隔控制等反爬规避策略,严格遵守豆瓣社区使用规范。最终数据经清洗后存储为结构化Excel文件,并提供了数据可视化与增量更新方案。该方案为影视研究提供了可靠的数据获取方法,同时确保符合非商业使用、适度爬取等合规要求。

2503_91057718的博客 3460

一篇文章透彻理解 Spring Boot 启动原理,架构师必备知识,不为应付面试!

这个方法里,SpringBoot会做一些初始化的工作,比如设置应用的上下文环境,加载Spring的配置文件,等等。通过自动配置,SpringBoot能够根据咱们的项目依赖和配置文件,自动“猜测”咱们想要使用的技术,并帮咱们做好相应的配置。其实,SpringBoot的启动过程虽然复杂,但只要我们理解了其中的关键步骤和组件,就能更好地掌握它,并在项目中灵活运用。比如,如果咱们的项目中包含了Spring Web的依赖,SpringBoot就会自动配置一个嵌入式的Tomcat服务器,并注册相关的Bean。

Javaaaaaaaaaaa13的博客 1044

HFSS实战项目——高带外抑制特性SIW带通滤波器

本文对单级滤波器和双级滤波器的设计、工作原理及仿真结果进行了详细分析,并验证了双级SIW带通滤波器在性能方面的优越性,为微波通信系统中滤波器的设计和应用提供了重要参考。

2401_87464239的博客 1816

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1258

面试官:Spring Boot 的启动原理是什么?

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行接口。图片SpringBoot 会在Spring完全启动完成后,才开启Http流量。这给了我们启示:应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在或者等位置 注册服务,开启流量。例如 Spring Cloud Eureka 服务发现组件,就是在中注册服务的!

870

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

springboot bean 生命周期

一张长图透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试! - 掘金

lizhaohui493090418的博客 451

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

理解透彻!编程java的软件后端

深耕技术,啃下22个技术点 互联网行业更新换代非常快,行业常态便是不断学习,因此这些主流技术你一个都不能落下! ①并发编程 Java并发编程是整个Java开发体系中最难以理解,但也是最重要的知识点之一,因此学习起来比较费劲,从而导致很多人望而却步,但是无论是职场面试还是高并发高流量的系统的实现都离不开并发编程,能够真正掌握并发编程的人才在市场上供不应求。 ②JVM JVM存在的意义就是实现跨平台,而JVM也是中高级程序员必须要掌握的技术,基本上面试必问。学JVM也是为了更深入地理解Java,很多

m0_57501529的博客 263

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

你觉得你把spring boot给摸透彻了,面试时几个问题就把你手撕了

你觉得你把spring boot给摸透彻了,面试时几个问题就把你手撕了 前言: 随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,SpringBoot是企业级开发的整体整合解决方案,在现在企业项目开发中使用非常普遍,可以说现在是Java程序员到了必须学习SpringBoot的时候,很多同学对 Spring Boot 理...

Javazhoumou的博客 751
上一篇: 项目从 MySQL 切换 PostgreSQL,踩了太多的坑!!!
下一篇: 接口设计的18条军规
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值