SpringBoot如何扫描启动类所在包及子包

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

前言

当初学习SpringBoot框架的时候发现他只会扫描启动类所在包下和子包。最近刚好在学源码,想要探究为什么是默认扫描启动类所在包,而不是其他路径?我从run方法开始debug。SpringApplication的run方法可以找到SpringBoot的大致启动流程。
SpringBoot如何扫描启动类所在包及子包

多的不说,SpringBoot实际上也是依托与Spring的。而注解扫描不可能会放在创建应用上下文阶段的,debug发现在createApplicationContext和prepareContext方法调用后IOC容器中并没有扫描到我们自己定义的bean。但是我们的主启动类被加载了。
SpringBoot如何扫描启动类所在包及子包
进入refreshContext方法,发现实际上调用的是Spring框架中的refresh方法。refresh方法贯穿了整个Spring框架的启动过程,内容有点多我就不详细介绍了。想要了解的可以去学习一下Spring源码。我只会大致说一下内容。
SpringBoot如何扫描启动类所在包及子包
值得注意的是,obtainFreshBeanFactory在Spring中确实是创建ioc容器的。不过SpringBoot在调用refresh方法前就以及创建了,所以SpringBoot是不会重新创建容器的,我在具体的实现打断点结果并没有进入断点。
SpringBoot如何扫描启动类所在包及子包
其他的方法我就不详细介绍了,SpringBoot的扫描重点是在invokeBeanFactoryPostProcessors方法中。invokeBeanFactoryPostProcessors方法就是调用各个BeanFactoryPostProcessor,不过调用过程也分优先级,它是优先调用@PriorityOrdered注解和@Ordered修饰的处理器。其中有一个关键的类:ConfigurationClassPostProcessor。顾名思义,翻译过来就是配置类后置处理器。
SpringBoot如何扫描启动类所在包及子包

==============================================================================SpringBoot如何扫描启动类所在包及子包
ConfigurationClassPostProcessor类就是负责扫描标记了@Configuration等注解,这就是为什么它要被第一个调用。只有它被调用了才能扫描到注解导入的Bean。在processConfigBeanDefinitions中会调用ConfigurationClassParser类的parse方法对启动类进行解析。
SpringBoot如何扫描启动类所在包及子包
启动类上带了SpringBootApplication注解,结果为true。SpringBoot如何扫描启动类所在包及子包
进入parse方法后会调用processConfigurationClass处理配置类。SpringBoot做事的一般都是do开头的,所以直接进入doProcessConfigurationClass方法。
SpringBoot如何扫描启动类所在包及子包
终于在doProcessConfigurationClass方法中见到了熟悉的东西。在方法中会判断类上是否有@CompomentScan注解,而SpringBootApplication是个组合注解,点进去查看实际上是由@CompomentScan组合来的。
SpringBoot如何扫描启动类所在包及子包
SpringBoot如何扫描启动类所在包及子包
在parse方法中会对这个@CompomentScan注解的信息进行解析,比如拿到我们要扫描的包路径,但是默认是没有路径的,那SpringBoot是怎么处理的呢?SpringBoot会默认以启动类所在包为路径调用doScan进行扫描。
SpringBoot如何扫描启动类所在包及子包
实际上到这里大家应该都以及知道了。有了包路径接下来就是扫描所有的Bean并解析成BeanDefinition放入ioc容器的map中。其中findCandidateCompoments就是进行字符串拼接,将刚才的包路径拼接上+/**/*.class,扫描对应的Bean。SpringBoot如何扫描启动类所在包及子包
SpringBoot如何扫描启动类所在包及子包文章来源地址https://www.toymoban.com/news/detail-402990.html

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

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

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

相关文章

  • springboot+vue前后端分离项目打包成jar包及运行

    将 Spring Boot 和 Vue.js 项目打包成 jar 包需要按照以下步骤操作: 在项目的根目录中,使用命令行进入 Vue.js 项目的根目录,然后运行以下命令: 这个命令将会构建 Vue.js 项目,并在项目的 dist 目录中生成一个编译好的前端静态文件。 在 Spring Boot 项目中,找到 Maven 配置文件

    2024年02月02日
    浏览(89)
  • SpringBoot获取jar文件所在目录

    例如我把jar文件放在/opt/test/目录下,并且把当前工作目录定位在/opt/test/目录下,获取到的结果确实是:/opt/test/ 但是! 但是! 但是!当我把工作目录切换(cd /home/)到其它地方:例如:/home/ 这时候再次通过上面的方式获取到的结果就不是理想的结果了,而是:/home/ 之后我

    2024年02月09日
    浏览(37)
  • springboot项目如何配置启动端口

    项目启动需要一个独立的端口,所以在此记录一下。 根据配置文件的后缀书写格式略有不同。 若是.yaml后缀的配置文件,那么端口书写为 此格式切记缩进 若是.properties后缀的配置文件,那么端口书写为 两端使用等号链接 设置–工具–终端–环境变量: server.port=端口号 因为

    2024年02月03日
    浏览(40)
  • 如何一次性启动多个SpringBoot项目

    在做微服务这块的架构设计的时候,当微服务数量越来越多的时候,本地启动各个服务的时候,可能得手动启动每个启动类。这样就很麻烦,因此记录一下如何在 idea 里面一键启动所有的项目。 比如我项目里面有5个微服务:那么就对应了5个启动类。 1.项目右上角编辑: 2.点

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

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

    2024年02月05日
    浏览(40)
  • 说说如何在SpringBoot中启动加载全局变量

    需要加载全局变量的情况很常见,如取通用的系统初始化配置等 Spring Boot 可以通过实现 CommandLineRunner 或 ApplicationRunner 接口,让某些代码在 Spring Boot 应用启动之后执行。因此,在启动时从数据库加载全局变量,可以在这些接口的 run() 方法中实现 在这个类中,全局变量被定义

    2024年02月16日
    浏览(27)
  • 【JAVA面试】SpringBoot如何启动的Tomcat

    提示:文章先作为初版,等后续时间充足后,补充更深的内容 在Spring Boot应用程序中, 内嵌的Tomcat服务器是通过Spring Boot Starter Web模块提供的功能 来启动的。下面是Spring Boot启动Tomcat的大致过程: 引入Spring Boot Starter Web依赖:在项目的pom.xml文件中添加 Spring Boot Starter Web依赖

    2024年02月04日
    浏览(46)
  • python 如何获取 excel 表格中数据所在的行和列

    比如有下面一张excel表,我们需要得到“张思德”所在的行和列

    2024年02月12日
    浏览(40)
  • SpringBoot 底层机制分析【Tomcat 启动+Spring 容器初始化+Tomcat 如何关联Spring 容器】【下】

    😀前言 本篇博文是关于SpringBoot 底层机制分析实现,希望能够帮助你更好的了解SpringBoot 😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月13日
    浏览(42)
  • Python如何求出矩阵中的最大值最小值以及所在的位置

    想着记录下来吧,代码小白,一点一点来。 题目简述:有个50x53的矩阵G,第53列是每一行的总和,目的是求出第53列的最小值,并输出最小值所在行的所有元素。 因为要根据第52列来找出最小值,调用min()函数便能求出最小值; min = G[:,52].min() 结果为13561.0,发现对应的是矩

    2024年02月12日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包