SpringBoot起步依赖和自动配置

news2024/9/23 7:29:03

文章目录

    • 1、起步依赖
    • 2、自动配置

1、起步依赖

概念
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起支持某一功能。

简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能
例子-搭建Web应用
Spring+SpringMVC

我们需要添加许多依赖,还要考虑到不同依赖之间存在版本冲突的问题,一般搭建一个Web项目时需要导入以下依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.3.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.3.RELEASE</version>
</dependency>

SpringBoot

搭建Web项目只需要导入一个起步依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

也就是只需要导入一个名为spring-boot-starter-web 的起步依赖即可,我们点 spring-boot-starter-web 进去可以看到,其实这个起步依赖集成了常用的 web 依赖。

2、自动配置

概念
SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,根据配置,才决定Spring配置应该使用哪个,这个过程是Spring自动完成的。
分析
在SpringBoot中集成了一些常见的容器,或者说是组件,例如我们最常用的Tomcat服务器,所以在做web项目时,不需要再另外部署到Tomcat上,可以直接运行,这就需要整个项目有一个入口,类似于普通java程序中的main方法(其实就是main方法),这个入口我们一般用一个单独的类来表示,其中包含一个main方法,这个类通常称之为SpringBoot的引导类,SpringBoot入门程序的引导类代码如下:

在这里插入图片描述
@SpringBootConfiguration@ComponentScan 注解。前者实质为 @Configuration 注解,这个注解相比大家都接触过,也就是起到声明这个类为配置类的作用,而后者起到开启自动扫描组件的作用。

这里需要重点分析的是 @EnableAutoConfiguration 这个注解,这个注解的作用是开启 Spring Boot 的自动配置功能,我们来分析一下它是如何开启的,点击进去可以看到:
在这里插入图片描述
可以看到这个注解上边又有两个注解,@AutoConfigurationPackage和@Import,@AutoConfigurationPackage是用来管理自动配置类的,可以先不看,先看@Import,这个注解在Spring纯注解配置当中也使用过,它的作用是导入另外一个配置类,这里导入了一个叫做AutoConfigurationImportSelector的配置类,翻译过来就是自动配置的导入选择器,进一步挖它的源代码:
由于这个类内容较多,我们只关心它实现自动配置的步骤,所以我们根据内部调用关系一步一步找:

在这里插入图片描述
内容太多看不懂不要紧,我们只看关键部分,这是我们找到的关键方法,第一个方法字面意思就是“选择导入”,它的内部又调用了第二个关键方法,意为“获取自动配置入口”,在这个getAutoConfigurationEntry()方法中可以明显看到configurations这样的关键字眼(通过下面的分析可以确定里面装的是一些配置类的全限定类名),而且它是一个字符串类型的集合,它来自于getCandidateConfigurations()方法,所以我们在这个类中继续往下找这个方法:
在这里插入图片描述

挖到这里,可以看到它还在继续调用其他类中的方法,这个时候要还想继续往下挖可能就有一定难度了,但是在这个时候我们可以从下方的message中发现一点猫腻,里面的META-INF/spring.factories好像看起来是某个路径下的,那么是那个路径下呢,我们可以盲猜就是当前这个类相关的某个路径,所以我们来到这个类的最上方看它的全限定包名:
在这里插入图片描述

我们可以根据这个包名在我们导入的Libraies里面去找这个包,然后真的找到了这么一个配置文件:

在这里插入图片描述
在这里插入图片描述
这个配置文件里面是一些全限定类名,而且每个类名都是以AutoConfiguration结尾的,这就基本可以确定上面那个configurations里面对应的就是这些内容,然后继续在里面找我们认识且熟悉的:在这里插入图片描述
前面提到的内置Tomcat就是在这个里面进行配置的,我们通过这个全限定类名继续找到这个类:
在这里插入图片描述
我们通过关键注解@EnableConfigurationProperties(ServerProperties.class)继续往下挖,找到ServerProperties这个类:在这里插入图片描述
可以看到这个类中定义了很多跟tomcat服务器有关的属性,如port端口、address地址等,上面有一个@ConfigurationProperties注解的属性中有一个prefix = “server”,这个其实就是对应配置文件中的前缀,那么配置文件在哪呢,我们继续回到spring.factories同级的目录下,会发现如下的一个json文件:
在这里插入图片描述
在这里插入图片描述
在这个.json文件中,可以找到跟刚才相关的配置,也就是说,这个json文件里面的值,就是SpringBoot自动配置时帮我们配置的值,如果我们需要更改这些配置,只需要在我们的配置文件中配置一下就行了,就会覆盖这里的默认配置,而使用我们的自定义配置。

SpringBoot自动配置原理的分析,到这里就基本结束了,虽然分析得比较浅薄,但是对于初学者想初步了解SpringBoot自动配置过程来说,这种深度恰到好处。等进一步熟练它的使用后,可以再进一步往底层挖掘,虽然有些太细节的东西,在项目开发中基本用不到,但是自己有一定了解的话,在使用过程中碰到问题可以有更清晰的思路去定位并解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这才是后端API该有的样子

一般系统大致架构如下&#xff1a; 有些小伙伴会说&#xff0c;这个架构太简单太low了吧&#xff0c;什么网关、缓存、消息中间件都没有。 需要说明的是&#xff0c;因为我们主题是API接口&#xff08;tbAPI&#xff0c;pinduoduo API接口调用&#xff09;所以聚焦这一点上就行…

Java FileChannel文件的读写实例

一、概述&#xff1a; 文件通道FileChannel是用于读取&#xff0c;写入&#xff0c;文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率&#xff0c;他们读和写直接建立了通道&#x…

【Leetcode刷题】链表的中间结点和合并两个有序链表

生命如同寓言&#xff0c;其价值不在与长短&#xff0c;而在与内容。 ——塞涅卡 目录 一.链表的中间结点 1.快慢指针 二.合并两个有序链表 1.尾插法 一.链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结…

Java——对象克隆(复制)

假如想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就复杂了。 假设说我是一个b…

windows安装scoop

scoop介绍 Scoop是一款适用于Windows平台的命令行软件&#xff08;包&#xff09;管理工具。简单来说&#xff0c;就是可以通过命令行工具&#xff08;PowerShell、CMD等&#xff09;实现软件&#xff08;包&#xff09;的安装管理等需求&#xff0c;通过简单的一行代码实现软…

博客上几种新职业的工作指南

© 2019 Conmajia 我不是在嘲讽谁&#xff0c;真的&#x1f605; 看了不少博客&#xff0c;发现了一些共同点。我觉得可以把这些博主分类一下&#xff0c;形成几种新的职业。 1. 超文本抄书匠Hypertext Copier Job description 拥有悠久历史的手打大师&#xff0c;大段抄录…

2023-04-16 算法面试中常见的栈和队列问题

栈和队列 1 栈的基础应用:20.括号匹配 class Solution {public boolean isValid(String s) {Stack<Character> stack new Stack<>();for (int i 0; i < s.length(); i) {char c s.charAt(i);if (c ( || c [ || c {) {stack.push(c);} else {// 还有字符…

【Linux】进程间通信 -- 命名管道

前言 在管道的通信中&#xff0c;除了匿名管道&#xff0c;还有一个命名管道。 匿名管道只支持具有“亲戚关系”的进程间通信&#xff0c;而命名管道就可以支持不同的&#xff0c;任意的进程通信。 那就下来就开始我们今天的学习。 文章目录 前言一. 命名管道二. 命名管道的应用…

快速了解数据仓库建模

快速了解数据仓库建模 1、什么是OLTP和OLAP&#xff1f;2、为什么不在业务系统做数据分析呢&#xff1f;3、什么是数据库建模&#xff1f;4、关系建模。5、维度建模。5.1 事实表5.2 维度表 6、 数据仓库分层。6.1、 数仓分层结构6.2、 为什么需要对数据仓库分层&#xff1f; 1、…

Linux网络服务之DHCP篇

目录一、了解DHCP服务1.1DHCP定义1.2DHCP好处1.3DHCP的分配方式二、DHCP工作过程三. 使用DHCP动态配置主机地址一、了解DHCP服务 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录…

基于SDM450 兼容st7701s不同id屏幕

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 sdm450 P326 在高通的 SDM450 中&#xff0c;有两种屏幕初始化代码&#xff0c;分别称为 "lk" 和 "kernel" 代码&#xff0c; "lk" 代码是用于在内核中初始化屏幕的代码。它通常在内核…

【Linux】进程间通信 -- 匿名管道的应用

前言 上篇博客初步学习了匿名管道的周边知识和使用&#xff0c;本篇文章将基于这些知识&#xff0c;实现一下进程间通信 话不多说&#xff0c;马上开始今天的内容 文章目录 前言一. 大体框架二. 分配任务三. 创建控制模块四. 开始通信五. 关闭程序六. 完整代码结束语 一. 大体框…

每日一题 leetcode1026 2023-4-18

1026. 节点与其祖先之间的最大差值 力扣题目链接 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何…

【CSS】使用 z-index 属性值控制定位盒子的堆叠顺序 ( 多个盒子堆叠次序问题 | z-index 属性值简介 | 控制盒子堆叠次序 )

文章目录一、多个盒子堆叠次序问题二、z-index 属性值简介三、控制盒子堆叠次序一、多个盒子堆叠次序问题 在 网页布局 中 , 如果 多个盒子都设置 绝对定位 , 那么这些盒子会堆叠在一起 ; 设置了定位样式的盒子会压住标准流盒子 , 如果有多个设置定位的盒子 , 后面的盒子会压住…

数组篇刷题总结

二分查找&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target …

【brtc】视频下行弱网对抗优化

百度云 音视频实时通信五个部分 1 RTC基础 需要云端服务器参与大量边缘服务器参与采集、前处理(图像处理)、压缩编码音频 3 A 回声消除、增益健全的六大指标 </

nodejs扫描文件夹搜索包含关键词文件,可灵活配置

代码放在在末尾 文件说明&#xff1a; 关键代码&#xff1a;search.js 搜索结果&#xff1a;searchResult.txt 搜索日志&#xff1a;search.log 注&#xff1a;只保留一次的&#xff0c;需要多次自行修改logFile配置即可&#xff1b; 使用方式&#xff1a; 将代码放到需要…

c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法

c/c:一维数组&#xff0c;初始化数组&#xff0c;循环打印数组&#xff0c;计算数组存储空间&#xff0c;数组元素个数&#xff0c;数组逆序算法 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; …

一文讲解系统性能分析之|iowait是什么?

我们对系统性能进行优化时&#xff0c;一般会使用 top 命令来查看系统负载和系统中各个进程的运行情况&#xff0c;从而找出影响系统性能的因素。如下图所示&#xff1a; top top 命令会输出很多系统相关的信息&#xff0c;如&#xff1a;系统负载、系统中的进程数、CPU使用率…

联诚发携多款创新产品及解决方案惊艳亮相ISLE 2023展!

这里写自定义目录标题4月7日-9日&#xff0c;ISLE 2023国际智慧显示及系统集成展览会在深圳国际会展中心&#xff08;宝安新馆&#xff09;隆重举行。来自全球各地1000余家企业参与展出&#xff0c;展出面积达8万㎡&#xff0c;吸引了众多业内专家、企业家以及广大观众前来观看…