SpringBoot的启动原理

这篇具有很好参考价值的文章主要介绍了SpringBoot的启动原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot

springboot是基于spring的轻量级框架,最厉害的地方当属自动配置。那我们就来看看springboot是如何启动的

用过springboot的技术人员很轻松的就能看出其他的框架和springboot的区别在哪里,就是springboot有自己独立的启动类(独立程序)

新建一个springboot项目,就可以看到这个springboot的启动类
SpringBoot的启动原理
这个springboot启动类有两个非常醒目的地方,就是

@SpringBootApplication
SpringApplication.run(DemoApplication.class, args)

@SpringBootApplication注解

我们点进去这个SpringBootApplication注解
SpringBoot的启动原理
我们这里可以看到@SpringBootApplication注解是一个复合注解
里面包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解

@SpringBootConfiguration注解
SpringBoot的启动原理

点开发现它包含了@Configuration注解,@Configuration在Spring中已经很熟悉了是个配置类的注解。
之前我们在applicationContext.xml中写过配置信息:
SpringBoot的启动原理
那我们在springboot中就可以写一个@Bean注解:
SpringBoot的启动原理

这两种效果是一样的,但前者为xml配置、后者为JavaConfig的配置形式。

@ComponentScan
字面意思可以看出它是组件扫描,它会描并加载符合条件的组件(比如@Component和@Service等)或者bean定义,最终将这些bean定义加载到IOC容器中

使用basePackages 知道要扫描的路径
使用includeFilters 来过滤要包含的组件
使用excludeFilters 来过滤要排除的组件

@AutoConfigurationPackage
自动配置包,点进去看它包含一个@Import({Registrar.class}) 注解,将Registrar作为bean导入Spring容器中。
它实现了ImportBeanDefinitionRegistrar接口,并重写了registerBeanDefinitions方法,其调用AutoConfigurationPackages.register,将其同级包名作为bean定义注册到容器中,这样可以给@ConponentScan作为默认的basePackages来扫描。

小结

整个启动过程,最重要的就是检索加载各个组件bean到Spring容器中的过程,
@Component(@Configuration、@Controller、@Service等也都是特殊的@Component),

@SpringBootApplication由三个组成:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

@SpringBootConfiguration
其也是一个@Configuration,它会把启动类作为一个配置类加到Spring容器中,
@ComponentScan会检索各类组件(@Component)加到Spring容器中,

@EnableAutoConfiguration由两个组成:@AutoConfigurationPackage(主要为@Import({Registrar.class}))、@Import({AutoConfigurationImportSelector.class})

@AutoConfigurationPackage——@Import({Registrar.class}),会把启动类所在目录及其子包作为bean定义注册,供@ComponentScan自动扫描这些包下的组件。@Import({AutoConfigurationImportSelector.class}),其AutoConfigurationImportSelector实现了很多接口,重要的是DeferredImportSelector接口,它继承了ImportSelector接口,所以重写selectImports方法,会通过SpringFactoriesLoader类来加载"META-INF/spring.factories"文件,匹配"org.springframework.boot.autoconfigure.EnableAutoConfiguration"的列表会被反射成实例,这些都是@Configuration配置类,然后加入到Spring容器中。
核心差不多就这么多,再关注一下Tomcat。
我们在使用SpringBoot的时候,可以在其里边直接启动内嵌的Tomcat,启动WebServer
这里就启动了web服务,调用TomcatWebServer的start方法
所以,到这里内嵌的tomcat服务就这样在容器初始化的最后阶段启动了。

最后 再给大家附上一个springboot的启动流程图

SpringBoot的启动原理文章来源地址https://www.toymoban.com/news/detail-417797.html

到了这里,关于SpringBoot的启动原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

    基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程,以及介绍jacoco的基本原理 官网下载安装包解压到本地,https://www.jacoco.org/jacoco/ 只需要用到jacoco/lib 文件夹中的 jacocoagent.jar 以及jacococl

    2024年02月09日
    浏览(39)
  • 【SpringBoot】springboot启动热部署

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 在SpringBoot工程的pom.xml配置文件中,添加以下依赖 IDEA中激活热部署 快捷键: Ctrl + F9 图形化界面 Build Proje

    2024年02月02日
    浏览(31)
  • SpringBoot源码分析:SpringBoot启动源码(一)

    SpringBoot启动的源码分为前期初始化,和后期启动两个部分,我们从这两个部分开始介绍。 SpringBoot前期初始化主要由下面三行代码组成。  进入SpringApplication.getSpringFactoriesInstances方法  最终进入SpringFactoriesLoader.loadFactoryNames方法  最后SpringFactoriesLoader.loadSpringFactories会到sprin

    2024年02月07日
    浏览(42)
  • SpringBoot源码学习4——SpringBoot内嵌Tomcat启动流程源码分析

    系列文章目录和关于我 我在初学spring的时候,很懵逼,因为整个项目中不存在main方法,让我有点摸不着头脑。那时候我知道有个东西叫tomcat是它监听了端口,解析了协议调到了我的servlet。 在我初学SpringBoot的时候,很懵逼,有main方法了,但是tomcat在哪里呢,又是如何启动起

    2024年02月04日
    浏览(45)
  • springboot 项目启动不打印spring 启动日志

    今天项目遇到一个很奇怪的问题,服务在启动时,不打印spring 的启动日志。经过排查发现是因为其他的依赖引入了 log4j 的依赖,因为我们的项目用的是logback,所以项目中没有log4j 的相关配置,所以干扰到了日志的打印 下面是log4j缺失配置文件的告警日志: log4j:WARN No append

    2024年02月11日
    浏览(57)
  • 单机启动/开机启动SpringBoot服务的正确方式

      此操作只针对于测试环境或单机部署的情况下,使用Jenkins自动化部署或docker部署SpringBoot服务请忽略。 SpringBoot单机启动和集群启动的区别: 部署方式:单机启动可以直接运行jar文件或使用IDE启动应用程序,而双机集群启动需要将应用程序部署在多台机器上,并配置负载

    2024年02月21日
    浏览(39)
  • SpringBoot源码分析之Tomcat是如何在SpringBoot中启动的?

    一.前言 我们知道SpringBoot可以直接把传统的war包打成可执行的jar包,直接启动。这得益于SpringBoot内置了容器可以直接启动。本文将以 Tomcat 为例,来看看 SpringBoot 是如何启动 Tomcat 的。 一.SpringApplication初始化 调用到最终的run方法我们来看一下 这里面首先创建了一个SpringAppl

    2024年02月05日
    浏览(41)
  • 自定义SpringBoot启动图标

    在SpringBoot项目的 resources 目录下创建 banner.txt 文件 在https://www.bootschool.net/网站上复制Ascll艺术字(图)粘贴到banner.txt中保存。 启动项目就会加载 可以修改颜色,和版本号

    2024年01月18日
    浏览(33)
  • 优化SpringBoot程序启动速度

    Spring Boot 程序优化 一、延迟初始化Bean 一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的创建等等,我们可以延迟这些操作的初始化,来达到优化启动速度的目的。Spring Boot 2.2 版本后引入 spring.main.lazy-initialization 属性,配置为 true 会将所有 Bean

    2024年02月20日
    浏览(41)
  • springboot启动忽略某些类

    目前我这的开发环境和测试环境数据库是两份,但是其他如 kafka 、 redis 、 eureka 等等之类的,都是公用的。 这就会产生一个问题,我想本地跑单元测试,但是 kafka 消费到了测试环境的数据,然后异常重试又发送了延迟队列(我这里的延迟队列是基于kafka实现的),然后被测试环

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包