广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何理解SpringBoot核心运行原理和运作原理源码
  • 384
分享到

如何理解SpringBoot核心运行原理和运作原理源码

2024-04-02 19:04:59 384人浏览 泡泡鱼
摘要

如何理解SpringBoot核心运行原理和运作原理源码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。springBoot核心运行原理Spr

如何理解SpringBoot核心运行原理和运作原理源码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

springBoot核心运行原理

Spring Boot 最核心的功能就是自动配置,第 1 章中我们已经提到,功能的实现都是基于“约定优于配置”的原则。那么 Spring Boot  是如何约定,又是如何实现自动配置功能的呢?

本章会带领大家通过源码学习 Spring Boot 的核心运作原理,内容涉及自动配置的运作原理、核心功能模块、核心注解以及使用到的核心源代码分析。

核心运行原理

使用 Spring Boot 时,我们只需引|入对应的 Starters, Spring Boot  启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是 SpringBoot 的自动配置功能。我们先从整体上看一下  Spring Boot 实现该运作机制涉及的核心部分,如图 2-1 所示。

如何理解SpringBoot核心运行原理和运作原理源码

图 2-1 描述了 Spring Boot  自动配置功能运作过程中涉及的几个核心功能及其相互之间的关系包括@EnableAutoConfiguration、spring.factories、各组件对应的  AutoConfiguration 类、@Conditional 注解以及各种 Starters。

可以用一句话来描述整个过程:Spring Boot 通过@EnableAutoConfiguration 注解开启自动配置,加载  spring.factories 中注册的各种 AutoConfiguration 类,当某个  AutoConfiguration类满足其注解@Conditional 指定的生效条件(Starters 提供的依赖、配置或 Spring 容器中是否存在某个  Bean 等)时,实例化该 AutoConfiguration 类中定义的 Bean(组件等),并注入 Spring  容器,就可以完成依赖框架的自动配置。

我们先从概念及功能上了解一下图 2-1 所示部分的作用及相互关系,在后面章节中会针对每个功能及组件进行源代码级别的讲解。

  • ·@EnableAutoConfiguration:该注解由组合注解@SpringBootApplication  引入,完成自动配置开启,扫描各个jar包下的spring.factories文件,并加载文件中注册的AutoConfiguration类等。

  • ·spring.factories:配置文件,位于 jar 包的 META-INF 目录下,按照指定格式注册了自动配置的  AutoConfiguration 类。spring.factories 也可以包含其他类型待注册的类。该配置文件不仅存在于 Spring Boot  项目中,也可以存在于自定义的自动配置(或 Starter)项目中。

  • ·AutoConfiguration 类:自动配置类,代表了 Spring Boot 中一类以  XXAutoConfiguration命名的自动配置类。其中定义了三方组件集成 Spring 所需初始化的 Bean 和条件。

  • ·@Conditional:条件注解及其衍生注解,在 AutoConfiguration 类上使用,当满足该条件注解时才会实例化  AutoConfiguration 类。

  • ·Starters:三方组件的依赖及配置,Spring Boot 已经预置的组件。Spring Boot 默认的Starters 项目往往只包含了一个  pom 依赖的项目。如果是自定义的 starter,该项目还需包含 spring.factories 文件、AutoConfiguration  类和其他配置类。

以上在概念层面介绍了 Spring Boot 自动配置的整体流程和基本运作原理,下面将会详细介绍这几个核心部分的组成结构及源代码。

运作原理源码解析 Z@EnableAutoConfiguration

@EnableAutoConfiguration 是开启自动配置的注解,在创建的 SpringBoot  项目中并不能直接看到此注解,它是由组合注解@SpringBootApplication 引入的。下面我们先来了解一下  入口类和@SpringBootApplication 注解的功能,然后再深入了解@EnableAutoConfiguration注解的构成与作用。

入口类和@SpringBootApplication 注解

Spring Boot 项目创建完成会默认生成-个*Application 的入口类。 在默认情况下,无论是通过 idea 还是通过官方创建基于  Maven 的 Spring Boo 项目,入口类的命名规则都是artifactld+Application。通过该类的 main 方法即可启动 Spring  Boot 项目,代码如下。

@SpringBootApplication public class SpringLearnApplication { public static void main(String[] args) { SpringApplication. run(DemoApplication. class, args); }}

这里的 main 方法并无特别之处,就是一一个标准的 Java 应用的 main 方法,用于启动 SpringBoot  项目的入口。在默认情况下,按照上述规则命名并包含 main 方法的类称为入口类。

在 Spring Boot 入口类(除单元测试外)中,唯一的一个注解就是@SpringBootApp-lication。

它是 Spring Boot 项目的核心注解,用于开启自动配置,准确说是通过该注解内组合的@EnableAutoConfiguration  开启了自动配置。

@SpringBootApplication 部分源代码如下。

@Target(ElementType . TYPE) @Retent ion(Retent ionPolicy . RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfi guration @ComponentScan( excludeFilters = { @Filter(type = FilterType .CUSTOM, classes = TypeExcludeFilter. class), @Filter(type = FilterType. CUSTOM, classes = AutoConf igurationExcludeFilter . class) })public @interface SpringBootApplication { //排除指定自动配置类 @AliasFor(annotation = EnableAutoConfiguration.class) Class<?>[] exclude() default {}; //排除指定自动配置类名 @AliasFor( annotation = EnableAutoConfiguration. class) String[] excludeName() default { //指定扫描的基础包,激活炷解组件的初始化 @AliasFor( annotation = ComponentScan. class, attribute = "basePackages") String[] scanBasePackages() default {}; //指定扫描的类,用于初始化 @AliasFor( annotation = ComponentScan. class, attribute = "basePackageClass Class<?>[] scanBasePackageClasses() default {}; //指定是否代理@Bean 方法以强制执行 bean 的生命周期行为 @AliasFor( annotation = Configuration.class) boolean proxyBeanMethods() default true ; }

通过源代码可以看出,该注解提供了以下成员属性(注解中的成员变量以方法的形式体现)。

  • exclude:根据类(Class) 排除指定的自动配置,该成员属性覆盖了@SpringBoot-Application中组合的@  EnableAutoConfiguration 中定义的 exclude 成员属性。

  • excludeName :根据类名排除指定的自动配置,覆盖了@ EnableAutoConfiguration 中的excludeName  的成员属性。

  • :scanBasePackages:指定扫描的基础 package,用于激活@Component 等注解类的初始化。

  • scanBasePackageClasses:扫描指定的类,用于组件的初始化。

  • :proxyBeanMethods:指定是否代理@ Bean 方法以强制执行 bean 的生命周期行为。此功能需要通过运行时生成 CGLIB  子类来实现方法拦截。该子类有一定的限制,比如配置类及其方法不允许声明为 final 等。

proxyBeanMethods 的默认值为 true,允许配置类中进行 inter-beanreferences (bean 之  间的引用)以及对该配置的@Bean 方法的外部调用。如果@Bean 方法都是自包含的,并且仅提供了容器使用的普通工程方法的功能,则可设置为 false,避免处理  CGLIB 子类。SpringBoot 2.2 版本上市后新增该成员属性,后面章节涉及的自动配置类中基本都会用到proxyBeanMethods,一  般情况下都配置为 false。

通过以上源代码我们会发现,Spring Boot 中大量使用了@AliasFor  注解,该注解用于桥接到其他注解,该注解的属性中指定了所桥接的注解类。如果点进去查看,会发现@SpringBootApplication 定  义的属性在其他注解中已经定义过了。之所以使用@AliasFor注解并重新在@SpringBootApplication  中定义,更多是为了减少用户使用多注解带来的麻烦。

@SpringBootApplication

注 解 中 组 合 了 @SpringBootConfiguration 、@EnableAutoConfiguration  和@ComponentScan。因此,在实践过程中也可以使用这 3 个注解来替代@SpringBootApplication。

在 Spring Boot 早期版本中并没有@SpringBootConfiguration  注解,版本升级后新增了@SpringBootConfiguration 并在其内组合了@Configuration。

@EnableAutoConfiguration 注解组合了@AutoConfigurationPackage.我们忽略掉一些基础注解和元注解,  @SpringBootApplication 注解的组合结构可以参考图2-2。

如何理解SpringBoot核心运行原理和运作原理源码

在图2-2中,@SpringBootApplication除 了组合元注解之外,其核心作用还包括:激活SpringBoot 自 动 配 置 的  @EnableAutoConfiguration 、 激 活 @Component 扫 描  的@ComponentScan、激活配置类的@Configuration。

其中@ComponentScan 注解和@Configuration 注解在日常使用 Spring 时经常用到,也非常 基 础 , 大 家应该都有一些了  解 , 这 里 就 不 再 赘 述 了 。 下 面 详 细 介 绍@EnableAuto-Configuration 的功能。

如何理解SpringBoot核心运行原理和运作原理源码

注解@EnableAutoConfiguration功能解析

在未使用 Spring Boot 的情况下,Bean 的生命周期由 Spring 来管理,然而 Spring 无法自动配置@Configuration  注解的类。而 Spring Boot 的核心功能之-  就是根据约定自动管理该注解标注的类。用来实现该功能的组件之-便是@EnableAutoConfiguration 注解。

@EnableAutoConfiguration 位 于 spring-boot autoconfigure 包 内 , 当 使  用@SpringBootApplication 注解时,@EnableAutoConfiguration 注 解会自动生效。

@EnableAutoConfiguration 的主要功能是启动 Spring 应用程序上下文时进行自动配置,它会尝试猜测并配置项目可能需要的  Bean。自动配置通常是基于项目 classpath 中引入的类和已定义的 Bean 来实现的。在此过程中,被自动配置的组件来自项目自身和项目依赖的  jar包中。

举 个 例 子 : 如 果 将 Tomcat-embedded.jar 添 加 到 classpath 下 , 那  么@EnableAutoConfiguration 会认为你准备用 TomcatServletWEBServerFactory  类,并帮你初始化相关配置。与此同时,如果自定义了基于 ServletWebServerFactory 的 Bean  ,那么@EnableAutoConfiguration 将不会进行 TomcatServletWebServerFactory  类的初始化。这一系列的操作判断都由 Spring Boot 来完成。

下面我们来看一下@EnableAutoConfiguration 注解的源码。

@Target(ElementType . TYPE) @Retention( RetentionPolicy . RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConf igurat ionImportSelector. class) public @interface EnableAutoConfiguration { //用来餐盖配置开启/关闭自动配置的功能 String ENABLED. OVERRIDE_ PROPERTY = "spring. boot . enableautoconf iguration" ; //根据类(Class) 排除指定的自动配置 Class<?>[] exclude() default {}; //根据类名排除指定的自动配置 String[] excludeName() default {}; }

@EnableAutoConfiguration 注解提供了一-个常量和两个成员参数的定义。

ENABLED OVERRIDE PROPERTY:用来覆盖开启/关闭自动配置的功能。

  • -exclude:根据类(Class) 排除指定的自动配置。

  • excludeName:根据类名排除指定的自动配置。

正如上文所说,@EnableAutoConfiguration 会猜 测你需要使用的 Bean,但如果在实战中你并不需要它预置初始化的  Bean,可通过该注解的 exclude 或 excludeName  参数进行有针对性的排除。比如,当不需要数据库的自动配置时,可通过以下两种方式让其自动配置失效。

//通过@SpringBootAppl ication 排除 DataSourceAutoConfiguration @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class SpringLearnApplication {}或://通过@Enabl eAutoConfiguration 排除 DataSourceAutoConfiguration @Configuration@EnableAutoConfiguration( exclude = DataSourceAutoConfiguration. class)public class DemoConfiguration {}

需要注意的是,被@EnableAutoConfiguration 注 解的类所在 package 还具有特定的意义,通常会被作为扫描注解@Entity  的根路径。这也是在使用@SpringBootApplication 注解时需要将被注解的类放在顶级 package 下的原因,如果放在较低层级,它所在  package 的同级或上级中的类就无法被扫描到。

而 对 于 入 口 类 和 其 main 方 法 来 说 , 并 不 依 赖 @SpringBootApplication 注 解  或@EnableAuto-Configuration 注解,也就是说该注解可以使用在其他类上,而非入口类上。

关于如何理解SpringBoot核心运行原理和运作原理源码问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网VUE频道了解更多相关知识。

--结束END--

本文标题: 如何理解SpringBoot核心运行原理和运作原理源码

本文链接: https://www.lsjlt.com/news/82106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解SpringBoot核心运行原理和运作原理源码
    如何理解SpringBoot核心运行原理和运作原理源码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot核心运行原理Spr...
    99+
    2022-10-19
  • PHP核心的运行机制与实现原理详解
    PHP是一种流行的开源服务器端脚本语言,大量被用于Web开发。它能够处理动态数据以及控制HTML的输出,但是,如何实现这一切?那么,本文将会介绍PHP的核心运行机制和实现原理,并利用具体的代码示例,进一步说明其运行过程。PHP源码解读PHP...
    99+
    2023-11-08
    实现原理 运行机制 PHP核心
  • Java的Tomcat和Servlet的运行原理详解
    目录一、客户端(浏览器)与服务器之间的交互二、Tomcat启动过程三、Tomcat处理请求过程四、Servlet的service方法总结在从前的时候,想要运行一个Java代码,就必须...
    99+
    2022-11-13
  • PHP 底层的运行机制和工作原理
    阅读目录 阐述一、PHP的设计理念及特点PHP 为什么没有多线程?1、PHP 与多线程2、PHP是单线程,多进程模型3、 php为什么选择多进程,而不是多线程4、场景 二、PHP 四...
    99+
    2023-08-31
    php 服务器 开发语言
  • 如何理解HTTP协议/IIS 原理及ASP.NET运行机制
    这篇文章给大家介绍如何理解HTTP协议/IIS 原理及ASP.NET运行机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言前一段在整理邮件的时候发现几年前和CDD老师交流时的一份邮件.下面是简单摘要:“从技术角度来...
    99+
    2023-06-17
  • 如何理解golang里面的读写锁实现与核心原理
    如何理解golang里面的读写锁实现与核心原理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。基础筑基读写锁的特点读写锁区别与互斥锁的主要区别就是读锁之间是共享的...
    99+
    2023-06-19
  • 如何进行webpack中bundle.js运行单步调试的原理解析
    本篇文章为大家展示了如何进行webpack中bundle.js运行单步调试的原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我这里可以在回顾一下这个web pack的hello world项目...
    99+
    2023-06-04
  • 深入理解golang编译器:揭示其关键特性和运行原理
    深入了解golang编译器:探索其核心特性与工作原理摘要:Go语言(又称golang)是一种由Google开发的编程语言,旨在提供简洁、高效的编程体验。在Go语言的背后,有一个强大的编译器工具链,这个工具链可以将Go代码转换为机器可执行的二...
    99+
    2023-12-29
    工作原理 核心特性 golang编译器
  • 如何理解JavaScript原型链和instanceof运算符的关系
    如何理解JavaScript原型链和instanceof运算符的暧昧关系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。时间回到两个月前,简单地理了理原型链、prototype以...
    99+
    2023-06-17
  • 如何进行Spring源码剖析AOP实现原理
    今天就跟大家聊聊有关如何进行Spring源码剖析AOP实现原理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言前面写了六篇文章详细地分析了Spring Bean加载流程,这部分完了...
    99+
    2023-06-02
  • 如何理解蜘蛛池的原理和作用
    这篇文章主要讲解了“如何理解蜘蛛池的原理和作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解蜘蛛池的原理和作用”吧!蜘蛛池是一种通过利用大型平台权重来获得百度收录以及排名的一种程序,...
    99+
    2023-06-10
  • 如何理解操作系统中的Hosts文件工作原理和作用
    本篇内容介绍了“如何理解操作系统中的Hosts文件工作原理和作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是Hosts文件?Ho...
    99+
    2023-06-13
  • 详解V8是如何执行一段JavaScript代码原理
    目录前言编译器和解释器1. 生成抽象语法树(AST)和执行上下文2. 生成字节码3. 执行代码JavaScript 的性能优化前言 了解 V8 的执行机制,能帮助你从底层了解 Ja...
    99+
    2023-05-15
    V8 执行JavaScript原理 V8 JavaScript
  • 如何理解低代码开发平台核心组件集成和协同
    这篇文章主要讲解了“如何理解低代码开发平台核心组件集成和协同”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解低代码开发平台核心组件集成和协同”吧!低代...
    99+
    2022-10-19
  • SAP Fiori编程模型规范里如何进行@ObjectModel.readOnly工作原理解析
    本篇文章为大家展示了SAP Fiori编程模型规范里如何进行@ObjectModel.readOnly工作原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SAP官网的ABAP Programm...
    99+
    2023-06-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作