【SpringBoot记录】自动配置原理(1):依赖管理

 前言

        我们都知道SpringBoot能快速创建Spring应用,其核心优势就在于自动配置功能,它通过一系列的约定和内置的配置来减少开发者手动配置的工作。下面通过最简单的案例分析SpringBoot的功能特性,了解自动配置原理。

SpringBoot简单案例

根据Spring官网Getting Started,以下是一个简单的基于SpringBoot的web应用。通过浏览器请求/hello,响应Hello SpringBoot。

案例结构

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>boot-01-helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>


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

</project>

启动类MainApplication

package com.test.boot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 主程序类
 * @SpringBootApplication:这是一个SpringBoot应用
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}

Controller

package com.test.boot.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {


    @RequestMapping("/hello")
    public String handle01(){
        return "Hello SpringBoot";
    }


}

运行测试

直接运行MainApplication中main方法。

分析

从上面案例可以看出,对比直接使用spring+springmvc的方式,最直接的区别是:

①依赖变少了,只需要引入一个父项目parent和一个spring-boot-starter-web依赖

②不需要写配置文件

③启动时不需要将应用部署到tomcat,也不需要在idea中配置tomcat后启动应用

整个SpringBoot案例制只引入了一个父项目和一个依赖,只能由此展开分析。

SpringBoot依赖管理

父项目

在maven中,父项目一般用作依赖管理:父项目中声明依赖,子项目继承父项目后,在使用同样依赖时无需写版本号。通过上述pom文件可以看出,父项目中一定有spring-boot-starter-web依赖。不妨看看父项目中都有什么。

spring-boot-starter-parent

点开父项目,发现它还继承了一个父项目spring-boot-dependencies,其余是一个properties、build等启动相关参数,部分代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
  </parent>
  <artifactId>spring-boot-starter-parent</artifactId>
  <packaging>pom</packaging>
  <name>spring-boot-starter-parent</name>
  <description>Parent pom providing dependency and plugin management for applications built with Maven</description>
  <properties>
    <java.version>1.8</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

.....

</project>

spring-boot-dependencies

继续查看spring-boot-dependencies.pom,其中必定有spring-boot-starter-web依赖,同时还声明了其他有很多依赖,几乎包括了所有开发中常用的依赖。同时对各个依赖的版本号进行了声明,自动进行版本仲裁。这意味着我们在使用这些这些依赖时,只要继承了父项目,在使用其中声明的依赖时,就不用再去解决各个依赖间的版本兼容问题

当然,如果需要使用特定的依赖版本,也可以在子项目中重新声明版本号。

starter场景启动器

了解完父项目,再看spring-boot-starter-web中具体引入了哪些依赖。先看看官方对于starter的描述。

简单的说,starter是一组依赖。通过引入一个starter依赖,该场景需要的所有依赖都被声明了,简化了开发的配置工作。比如上述spring-boot-starter-web,web开发场景需要的常规依赖都在其中。

这里需要注意的是,官方starter命名规范是:spring-boot-starter-xxxx。

也有一些第三方的starter,一般以xxx-spring-boot-starter命名。

SpringBoot所有支持的场景和相关的starter,部分如下图。除此之外,我们也可自行定义starter,后续会介绍。

spring-boot-starter-web

查看spring-boot-starter-web中的依赖,发现其中包括了spring核心依赖、tomcat依赖、一些其他web开发场景需要的依赖。

小结

以上就是SpringBoot的依赖管理,后面将继续在此案例基础上介绍SpringBoot的自动配置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的SPI通信

SPI通信 一. 1.SPI简介: SPI 是一种高速,全双工,同步串行总线。 SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。 SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS…

leetcode尊享面试100题(549二叉树最长连续序列||,python)

题目不长&#xff0c;就是分析时间太久了。 思路使用dfs深度遍历&#xff0c;先想好这个函数返回什么&#xff0c;题目给出路径可以是子-父-子的路径&#xff0c;那么1-2-3可以&#xff0c;3-2-1也可以&#xff0c;那么考虑dfs返回两个值&#xff0c;对于当前节点node来说&…

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调&#xff0c;要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”&#xff0c;同时“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”。对于金融行业而言&#xff0c;培育新质生产力是高质量发展的关键着力点。金融机构可以通…

vue项目启动后页面显示‘Cannot GET /’

1、npm run dev命令启动项目的时候没有报错&#xff0c;页面打开却提示 Cannot GET / 2.这个时候只需要找到config文件夹下面的index.js文件。把assetsPublicPath字符串的&#xff1a;‘./’修改成 ‘/’就行了。修改完之后记得关闭项目&#xff0c;然后重新启动。不然不会生效…

度小满——征信报告图建模

目录 背景介绍 发展趋势 技术演进 图在金融风控领域中的演进 度小满图机器学习技术体系 案例 征信报告介绍 征信报告图建模

postman接口测试中文汉化教程

想必同学们对于接口测试工具postman的使用并不陌生&#xff0c;以及最近大为流行的国产工具apifox。对于使用过的同学来说&#xff0c;两者区别以及优缺点很容易别展示出来&#xff0c;postman相比apifox来说更加轻量&#xff0c;但是apifox更加符合国人的使用习惯....中国人给…

Nest 快速上手 —— (三)中间件 / 异常过滤器

一、 中间件&#xff08;Middleware&#xff09; 1.特点 中间件是一个在路由处理程序之前被调用的函数。中间件函数可以访问请求和响应对象&#xff0c;以及应用程序请求-响应周期中的next()中间件函数。下一个中间件函数通常由一个名为next的变量表示。 中间件函数可以执行以…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电&#xff1a;测试手机来电时&#xff0c;能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件&#xff1a;待测手机与车载车载设备处于连接状态 2、测试步骤&#xff1a; 1&#xff09;用辅助测试机拨打待测手机&…

BetterMouse for Mac激活版:鼠标增强软件

BetterMouse for Mac是一款鼠标增强软件&#xff0c;旨在取代笨重的、侵入性的和耗费资源的鼠标驱动程序&#xff0c;如罗技选项。它功能丰富&#xff0c;重量轻&#xff0c;效率优化&#xff0c;而且完全隐私安全&#xff0c;试图满足你在MacOS上使用第三方鼠标的所有需求。 B…

新火种AI|AI让大家都变“土”了!

作者&#xff1a;一号 编辑&#xff1a;美美 AI不仅要把人变“土”&#xff0c;还要把人变多样。 这个世界&#xff0c;终究是变“土”了。 今年五一假期&#xff0c;一个名为“Remini”的AI修图APP火遍了全网。注意&#xff0c;是Remini&#xff0c;而不是Redmi&#xff0…

MySQL-集群1

一、为什么要用mysql集群&#xff1f;&#xff1a; mysql单体架构在企业中很少用&#xff0c;原因&#xff1a;①会形成单点故障&#xff0c;没有高可用的效果&#xff1b;②mysql本身是一个I/O能力比较差&#xff0c;并发能力比较差的应用服务&#xff0c;在较高规模的网络I/…

部署JVS服务出现上传文件不可用,问题原因排查。

事情的起因是这样的&#xff0c;部门经理让我部署一下JVS资源共享框架&#xff0c;项目的地址是在这里 项目资源地址 各位小伙伴们做好了&#xff0c;我要开始发车了&#xff0c;全新的“裂开之旅” 简单展示一下如何部署JVS文档 直达链接 撕裂要开始了 本来服务启动的好好…

【计算机毕业设计】基于SSM++jsp的蜀都天香酒楼网站【源码+lw+部署文档+讲解】

目录 摘要 Abstract 目 录 1绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4论文结构 2相关技术介绍 2.1 B/S模式 2.2 MyEclipse开发环境 2.3 MySQL数据库 2.4 Java语言 2.5 JSP技术 2.6 Tomcat服务器 3系统分析 3.1需求分析 3.2可行性分析 3.2.1经济可行性 3.2.2技…

Python运维之多进程!!

本节的快速导航目录如下喔&#xff01;&#xff01;&#xff01; 一、创建进程的类Process 二、进程并发控制之Semaphore 三、进程同步之Lock 四、进程同步之Event 五、进程优先队列Queue 六、多进程之进程池Pool 七、多进程之数据交换Pipe 一、创建进程的类Process mu…

5.9gunplot绘图堆叠柱状图

gunplot绘图堆叠柱状图 plot"要用的数据&#xff08;后缀名是.dat)" using 2 t(或者title) 跟着是要命名的属性名称 这个名称可以用.dat里的每列列名&#xff0c;也可以直接在后面跟着定义 plot "data.dat" using 2 t columnheader(2), using 3 t column…

PLC数据采集网关的功能和特点-天拓四方

一、引言 随着工业自动化程度的不断提高&#xff0c;数据在生产线上的作用愈发重要。PLC作为工业自动化的核心设备&#xff0c;其数据采集和处理能力直接影响到整个生产线的效率和稳定性。而PLC数据采集网关&#xff0c;作为连接PLC与外部系统的桥梁&#xff0c;正日益受到人们…

vue3—win7搭建vue3环境

背景 vue3环境要求node.js18.3及以上版本&#xff0c;所以我们需要安装更高版本node.js&#xff0c;然而win7无法支持高版本node.js。下面我介绍一种安装方法。 步骤 1、下载 node-v13.14.0-x64.msi 安装&#xff0c;默认安装即可。安装完成后&#xff0c;进入cmd&#xff0c…

Hibernate认识

一、定义 Hibernate 是一种开源的 Java 对象关系映射 (ORM) 框架&#xff0c;用于将面向对象的领域模型持久化到关系数据库中。它为开发人员提供了一种简便的方法来操作数据库&#xff0c;而无需编写繁琐的 SQL 代码。 ORM&#xff08;对象关系映射&#xff09;&#xff1a;Ob…

Linux 第二十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

提速25倍!MoonBit 新增后端支持,一周内成为热议焦点

MoonBit 新增 JS 后端支持 近期&#xff0c;MoonBit 迎来了重要更新&#xff1a;新增对 JavaScript 后端的支持&#xff0c;为用户带来了前所未有的性能提升。 MoonBit 诞生于2022年&#xff0c;是专为云计算及边缘计算设计的 AI 云原生编程语言及开发者平台。作为一门诞生于 …