SpringBoot 基础简介

news2025/1/13 13:22:37

目录

1. SpringBoot 概述

1.1. 为什么会有springboot

1.1.1. 传统Spring 的两个缺点

1.1.2. Springboot 功能

 2. SpringBoot 快速搭建

 2.1. 创建Maven项目​编辑​编辑​编辑

2.2. 导入SpringBoot起步依赖

 2.3. 定义controller

 2.4. 添加引导类

2.5. 启动访问 

3. SpringBoot 起步依赖原理分析

3.1. 什么是Maven BOM项目

3.2.  spring-boot-starter-parent 版本控制

3.3. 自己项目引入依赖的例子spring-boot-starter-web 

4. SpringBoot配置

4.1. 配置文件为什么选择使用YML而不是XML

4.2 YML基本语法

 4.3. YML数据格式 

4.3.1.  对象(map): 键值对的集合

4.3.2. 对象数组

4.3.3. 纯量(单个的,不可再分的值)

4.4. 读取YML配置方式

4.5. SpringBoot profile

4.5.1. Profile 配置方式 

4.5.2. profile激活方式

5. SpringBoot 配置加载


1. SpringBoot 概述

Spring Boot提供了一种快速使用Spring的方式,基于约定由于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
2014年4月,Spring Boot 1.0.0 发布。Spring的顶级项目之一(Spring | Projects)。

顶级项目是什么意思?
在Spring的语境中,顶级项目是指与Spring框架具有同等地位或重要性的项目。这些项目通常是在Spring社区中广泛认可、使用率高、功能强大且对Spring生态系统有重要贡献的。 

1.1. 为什么会有springboot

1.1.1. 传统Spring 的两个缺点
  1. 配置文件麻烦不好记.配置繁琐.浪费很多时间。
  2. 依赖繁琐,容易出错。引用不同的jar包兼容性配置麻烦。
1.1.2. Springboot 功能
  1. 自动配置
    传统的基于Spring的应用程序开发需要广泛的配置和许多复杂的组件和库来实现某些功能。这导致开发过程变得复杂且耗时。Spring Boot的目标就是消除这种困难和不便,它提供了一系列的约定和默认设置,使得开发人员能够更快地开发Spring应用程序。Spring Boot的设计目标之一就是能够快速地进行应用开发。
  2. 起步依赖

    起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM), 定义了对其他库的依赖传递。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

  3. 辅助功能
    Spring Boot内置了多种常用的服务器,如Tomcat、Jetty、Undertow等。这使得应用可以打包成一个可执行的JAR文件,并且可以直接运行,无需额外部署服务器。这进一步简化了应用的部署和管理过程。
    Spring Boot提供了健康检查功能(http://localhost:8080/actuator/health),可以通过HTTP或JMX等方式查看应用的运行状态和性能指标。这方便了运维人员进行监控和管理,确保应用的稳定性和可用性。
    随着微服务架构的流行,越来越多的应用被拆分成多个小的、独立的服务。Spring Boot对微服务架构提供了良好的支持,它使得开发人员可以轻松地构建、部署和管理微服务应用。

 2. SpringBoot 快速搭建

 2.1. 创建Maven项目

2.2. 导入SpringBoot起步依赖

  1. Spring-boot-starter-parent
  2. Spring-boot-starter-web
<?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.mycompany.springstudy</groupId>
    <artifactId>springboot-demo1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--springboot 工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--web 开发起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

 2.3. 定义controller

package com.mycompany.springstudy.controller;

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

@RestController
public class UserController {

    @RequestMapping("/helloUser")
    public String helloUser(){
        return "Hello, Good day user!";
    }
}

 2.4. 添加引导类

 引导类也就是springboot项目的入口。
1.  @SpringBootApplication
2.  main 方法中加 SpringApplication.run(*.class)

package com.mycompany.springstudy;

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

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

2.5. 启动访问 

         
 

总结:

  1. SpringBoot在创建项目时,使用jar的打包方式
  2. SpringBoot的引导类, 是项目入口,运行main方法就可以启动项目.
  3. 使用SpringBoot和Spring构建的项目,业务代码编写完全一样.
  4. 如上是手动创建,当然我们也可以使用Spring提供的快速搭建方式。网站Spring Initializr.

3. SpringBoot 起步依赖原理分析

    <!--springboot 工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--web 开发起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

3.1. 什么是Maven BOM项目

我们引用的springboot parent <artifactId>spring-boot-starter-parent</artifactId> 是一个Maven BOM(Bill of Materials)项目

BOM是指一个特殊的POM(Project Object Model)文件,该文件主要用于依赖管理,而不是直接包含项目代码或构建配置。
通过引入Maven BOM作为项目的依赖,你可以确保一组依赖项的版本在多个项目中保持一致,而无需在每个项目的POM文件中单独指定这些依赖项的版本。这有助于减少版本冲突,简化依赖管理,并提高项目的可维护性。

BOM项目的标识是 pom文件中配置了 <packaging>pom</packaging>。而packaging的默认类型是jar,也就是maven打包时会打成jar包,当然也可以配置为war

BOM项目通常有以下几种用途

  • 依赖管理:这种类型的项目通常被称为“BOM”(Bill of Materials)项目,它主要用于管理和定义一组依赖项及其版本。通过这种方式,其他Maven项目可以引入这个POM作为依赖,从而继承其定义的依赖项和版本,而无需在每个项目中单独定义。如我们这里的<artifactId>spring-boot-starter-parent</artifactId>
  • 多模块项目:在大型项目中,你可能会有多个模块,每个模块都有自己的POM文件。这些模块通常会有一个父POM文件,该文件使用<packaging>pom</packaging>指定其类型为POM。父POM文件用于管理子模块的公共配置,如依赖项、插件配置、属性等。子模块通过<parent>元素引用父POM。
    如下我们用idea定义一个多模块项目,父项目的pom包类型就为po

3.2.  spring-boot-starter-parent 版本控制

在spring的生态中,大多的项目都存在版本兼容问题,如spring cloud和spring boot的兼容如下。
我们知道spring融合的插件项目等那么多。那么他们的版本管理如果是让程序员自己去维护,对于每次项目升级,那将对程序员是一个耗时的过程。spring-boot-starter-parent 做的就是规范这件事。

我们打开spring-boot-starter-parent项目,可以发现它继续引用了<artifactId>spring-boot-dependencies</artifactId> 这个BOM项目,而它自身并没有做什么依赖版本控制

我们继续查看<artifactId>spring-boot-dependencies</artifactId>
可以看到它使用 dependencyManagement 做了大量的版本管理
注:dependencyManagement 管理的依赖是不会被直接引入到我们的项目中的,它只是帮助做版本管理,如果我们要使用对应的jar包,还需要自己在项目中引入。

其中的依赖又分为了如下两种

  • 对jar包的版本管理
          <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-placeholders</artifactId>
            <version>${xmlunit2.version}</version>
          </dependency>
  • 对其它BOM的嵌套引入
          <dependency>
            <groupId>com.datastax.oss</groupId>
            <artifactId>java-driver-bom</artifactId>
            <version>${cassandra-driver.version}</version>
    <!--type:pom 指定当前依赖的是一个BOM项目-->
            <type>pom</type>
    <!--scope:import 指定当前项目是从该BOM项目中引入dependencyManagement的版本依赖管理信息-->
            <scope>import</scope> 
          </dependency>

3.3. 自己项目引入依赖的例子spring-boot-starter-web 

我们这里在自己的spring boot项目中引入的<artifactId>spring-boot-starter-web</artifactId>jar包,我们就可以看到我们并没有指定它的jar包版本号,我们知道如果在maven项目中引入一个jar没有给它指定版本号,maven不能确定应该引入那个版本,项目启动是会报错的,所以它一定是在其他地方给他指定了。也就是3.2中的父项目spring-boot-starter-parent给他管理了。

4. SpringBoot配置

 SpringBoot 是基于约定的, 所以很多配置都是有默认值, 但如果想使用自己的配置替换默认配置的话,就可以使用如下三种配置文件格式配置。

  • application.properties
  • application.yml
  • application.yaml

默认文件名为application。它们的优先级为properties > yml > yaml 三种文件格式可以被同时加载,按优先级取值。

4.1. 配置文件为什么选择使用YML而不是XML

YAML文件的全称是YAML Ain't Markup Language(YML不是标记语言),也称为YAML文件。它是一种直观的、能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互。它可以被支持YAML库的不同的编程语言程序导入,如Java、C/C++、Ruby、Python、Perl、C#、PHP等。在Spring Boot中,YML文件(如application.yml)可以作为配置文件,用于修改Spring Boot自动配置的默认值。 YML文件是以数据核心的, 比传统的xml方式更加简洁.
我个人认为我们YML中配置基本都是给对象赋值,使用YML格式完全可以满足,而xml格式更为复杂,支持更多功能,如单个标签还支持设置各种属性(这些都是给对象赋值所不需要的)。那么它的解析必然更为复杂,手动配置也更容易出错。使用成本相对更高。

<table-cell border-style="solid" width="50px">
     <block><xsl:value-of select="mdj"/></block>
</table-cell>

4.2 YML基本语法

  1. 大小写敏感
  2. 数据值前边必须有格式,有多个也可以,一般写一个,作为分隔符.
  3. 使用缩进表示层级关系
  4. 缩进时不允许使用Tab, 只允许使用空格.(因为Tab键(制表符)在不同操作系统中对应的空格数并不固定,这主要取决于具体的编程环境、编辑器或开发工具的设置。容易导致层次混乱.)
  5. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可.默认比上一层多2个。
  6. #表示注释. 从这个字符一直到行尾 ,都会被解析器忽略.

 4.3. YML数据格式 

4.3.1.  对象(map): 键值对的集合
@Data
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
}
server:
  port: 8101

person:
  name: allen wang
  age: 30

可以得到对象:Person{name='allen wang', age=30}

4.3.2. 对象数组
@Data
@Configuration
@ConfigurationProperties(prefix = "persons")
public class PersonList {
    List<Person> personList;
}

数组配置方式一: 

server:
  port: 8080

persons:
  personList:
    - name: zhang san
      age: 80
    - name: li si
      age: 20

可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])
数组配置方式二: 

server:
  port: 8080

persons:
  personList:
    - {name: zhang san,age: 80}
    - {name: li si,age: 20}

可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])

数组配置方式三:

persons:
  personList: [{name: zhang san,age: 80},{name: li si,age: 20}]

可以得到对象:PersonList(personList=[Person{name='zhang san', age=80}, Person{name='li si', age=20}])

4.3.3. 纯量(单个的,不可再分的值)

Msg1: 'hello \n world'  #单引忽略转义字符
Msg2: "hello \n world" #双引识别转义字符

4.4. 读取YML配置方式

Spring boot读取配置内容三种方式。

  •  @Value 适用于单个属性
    获取普通键值:@Value("${person.name}")
    获取数组:@Value("${persons.personList[0]}")
  • Enrionment
    @Autowired
    private Environment env;
        @Autowired
        private Environment env;
    
        @RequestMapping("/helloUser")
        public String helloUser() throws JsonProcessingException {
            String name = env.getProperty("person.name");
            return name;
        }
  • @ConfigurationProperties(prefix = "person") 适用于对象和配置的绑定
    如果不添加(prefix = "person")就会默认按照纯量在根目录下寻找对应变量

4.5. SpringBoot profile

 我们在开发spring boot应用时, 通常同一套程序会被安装到不同环境,动态切换, 比如: 开发,测试,生产等. 其中数据库地址,服务器,端口等等配置都可能不同。如果每次打包时, 都要修改配置文件, 那么非常麻烦, profile功能就是来进行动态配置切换的。

4.5.1. Profile 配置方式 
  •  多个properties 合并成一个yml
    固定写法---三个-分割
    ---
    Spring:
      profiles: dev
    Server:
      port: 8081
    ---
    Spring:
      profiles: uat
    Server:
      port: 8082
    ---
    Spring:
      profiles: prod
    Server:
      prot: 8083
    ---
    Spring.profiles.active = dev
  •   YML多文档方式
    配置多个properties或yml文件
    如: 
    application.yml (本文件中配置Spring.profiles.active = dev信息)
    application-dev.yml
    application-uat.yml
    application-uat.yml
4.5.2. profile激活方式
  •  配置文件
     Spring.profiles.active = dev
    注意这个值必须要与yml文件的application-dev.yml 后面的值保持一致才能够生效.
  • 虚拟机参数(如cicd中的配置,idea本机配置)
    本机idea中配置
    VM options:
    -Dspring.profiles.active=dev

  • 命令行参数
    idea中配置
    Program arguments:
    --spring.profiles.active=dev
    如果我们打成jar也可以使用java -jar xxx.jar -- spring.profiles.active=dev

5. SpringBoot 配置加载

Spring Boot Reference Documentation

 java目录和resources目录下的文件打包后都会直接打包到classpath目录下

所以它的加载顺序从低到高分别如下:
1.Classpath:./ classpath的根目录 
也就是我们项目放在resources根目录下然后直接被打包到classpath的根目录下。
2. Classpath:/config/: classpath/config目录
3.file:./: 当前项目jar包所在的目录
4. file:./config/: 当前jar包所在目录的/config 目录下 

外部配置和内部配置形成一种互补的配置。
外部配置优于内部配置

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

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

相关文章

开源的 RAG 和 workflow 技术对比调研

一、先来了解一下开源的技术有哪些&#xff0c;怎么样 我自己就是做RAG工作的&#xff0c;但是还是想关注一下开源的技术做到了什么程度。 所以调研了很长时间&#xff0c;也体验了一下。这里写一篇文章来分享一下结果。 我用五一的假期时间&#xff0c;来做调研&#xff0c;看…

工业光源-环形无影光源-特点

产品特点 ◆采用特殊的漫射结构&#xff0c;使光均匀的扩散在照射区域&#xff1a; ◆常应用在被测物体需要均匀的的表面照明并且要避免反光或光斑的场合。

Jupyter Notebook 中使用虚拟环境的Python解释器

问题&#xff1a;创建虚拟环境&#xff0c;在pycharm中配置虚拟环境的Python解释器&#xff0c;然后在pycharm中打开ipynb&#xff0c;执行发现缺少包&#xff0c;但是虚拟环境中已经安装了 解决方式&#xff1a; 配置Jupyter Notebook 使用虚拟环境的Python解释器 1&#x…

thinkphp家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单安装教程

介绍 thinkphp家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单安装教程 上门预约服务派单小程序家政小程序同城预约开源代码独立版安装教程 程序完整&#xff0c;经过安装检测&#xff0c;可放心下载安装。 适合本地的一款上门预约服务小程序&#xff0…

matlab期末知识

1.期末考什么&#xff1f; 1.1 matlab操作界面 &#xff08;1&#xff09;matlab主界面 &#xff08;2&#xff09;命令行窗口 &#xff08;3&#xff09;当前文件夹窗口 &#xff08;4&#xff09;工作区窗口 &#xff08;5&#xff09;命令历史记录窗口 1.2 matlab搜索…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式&#xff1a;AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外&#xff0c;AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

Java将文件目录转成树结构

在实际开发中经常会遇到返回树形结构的场景&#xff0c;特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中&#xff0c;将List<String>转换成树状结构&#xff0c;需要定义一个树节点类&#xff08;TreeNode&#…

【Python编程实践1/3】模块

目录 目标 模块 import ​编辑 代码小结 题目 from...import 随机模块 代码小结 randint函数 骰子大战 choice函数 总结 目标 拧一颗螺丝&#xff0c;只会用到螺丝刀&#xff1b;但是修一台汽车&#xff0c;需要一整套汽修的工具。函数就像螺丝刀&#xff0c;可以帮…

Redis---------实现商品秒杀业务,包括唯一ID,超卖问题,分布式锁

订单ID必须是唯一 唯一ID构成&#xff1a; 代码生成唯一ID&#xff1a; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.tim…

2024年IEEE第16届先进信息通信技术国际会议(ICAIT 2024)即将召开!

2024年IEEE第16届先进信息通信技术国际会议&#xff08;ICAIT 2024&#xff09;将于2024年 8月16-19日在湖北恩施举行。先进信息通信技术作为当今世界科技发展的前沿领域&#xff0c;不仅是推动经济社会发展的重要引擎&#xff0c;也是提升国家综合竞争力的重要支撑。因此&…

EDA(一)Verilog

EDA&#xff08;一&#xff09;Verilog Verilog是一种用于电子系统设计自动化&#xff08;EDA&#xff09;的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;主要用于设计和模拟电子系统&#xff0c;特别是在集成电路&#xff08;IC&#xff09;和印刷电路板&#xff08;…

AI-数学-高中53-离散型随机变量的均值与方差

原作者视频&#xff1a;【随机变量】【一数辞典】3离散型随机变量的均值与方差_哔哩哔哩_bilibili 标准差 方差开根

算法数据结构--单调栈

文章目录 介绍单调递增栈单调递减栈图示应用场景 步骤模板Deque用法例题[739. 每日温度](https://leetcode.cn/problems/daily-temperatures/)[496. 下一个更大元素 I](https://leetcode.cn/problems/next-greater-element-i/) 总结 介绍 单调栈是一种特殊的栈数据结构&#x…

Excel中怎样把单元格里的数据拆分成多行?

时常会遇到这种情况&#xff0c;需要将一个单元格里的数据分拆到多行&#xff0c;可以使用公式&#xff0c;这里演示使用基础操作的办法。 按照excel使用经验&#xff0c;可以复制数据&#xff0c;粘贴到MS Word里&#xff0c;这个是excel的同族软件&#xff0c;兼容性好。 在…

基于SSM SpringBoot vue教务排课系统

基于SSM SpringBoot vue教务排课系统 系统功能 登录 个人中心 学生信息管理 教师信息管理 课室信息管理 班级信息管理 系别信息管理 专业信息管理 课程信息管理 选课信息管理 课表信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Myba…

基于 AI 的数据库助手-Chat2DB

序言 现在已经开始步入 AI 时代&#xff0c;AI 产品也已经络绎不绝。今天&#xff0c;给大家介绍一款数据库的 AI 产品 —— Chat2DB。 一、什么是 Chat2DB Chat2DB 由阿里提供的一个数据库管理、数据开发、数据分析的工具&#xff0c;它是一个 AI 原生的数据库管理工具&…

STM32数字示波器+详细注释+上位机程序+硬件

目录 1、设计指标&#xff1a; 2、功能&#xff1a; 3、上位机的程序 ​4、测试的照片 5、PCB 6、模拟电路板 7、程序 资料下载地址&#xff1a;STM32数字示波器详细注释上位机程序硬件 1、设计指标&#xff1a; 主控: STM32…

2022 亚马逊云科技中国峰会,对话开发者论坛

目录 前言 最近整理资料发现还有一些前 2 年的内容没发出来&#xff0c;故补发记录&#xff0c;每年都有新的感悟。 开发者论坛 1. 你认为什么是开发者社区&#xff0c;如何定义一个成功的开发者社区&#xff1f; 我认为可以把开发者社区看成一个 “产品” 来对待&#xff…

大功率双向直流电源的输出电压和电流

双向直流电源&#xff08;Bidirectional DC Power Supply&#xff09;是一种具有双向输出电能的直流电源。与传统的直流电源相比&#xff0c;双向直流电源在输出电能的同时&#xff0c;还具备一定的电流输入能力&#xff0c;从而使其应用范围更加广泛。大功率双向直流电源作为电…

n-Track Studio Suite for Mac激活版:打造您的专属音频工作室

n-Track Studio Suite for Mac是一款功能强大的数字音频工作站软件&#xff0c;让您在家中就能享受到专业录音棚的待遇。无论是录制人声、乐器还是MIDI序列&#xff0c;都能轻松应对。 n-Track Studio Suite for Mac激活版下载 这款软件拥有实时音高校准、时间拉伸和自动补足功…