SpringBoot 基础简介

目录

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 目录下 

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

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

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

相关文章

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

在家连学校的服务器

在家连接学校的服务器。 Step1: 首先下载一个vscode的插件 Visual Studio Code - Code Editing. Redefined 我的服务区是ubuntu20.04&#xff0c;x64的&#xff0c;所以下载这个。 Step2: 下载到本地之后&#xff0c;想办法将这个文件拷贝到你的服务器上。 Step3: 解压该包…

零基础该如何自学linux运维?

零基础该如何自学linux运维&#xff1f;以下是建议帮助你入门Linux运维的一些建议。 一、自学建议&#xff1a; 理解基础概念&#xff1a;首先&#xff0c;你需要对Linux操作系统的基本概念有所了解&#xff0c;包括文件系统、用户权限、进程管理等。安装Linux系统&#xff1…

AI-数学-高中-47导数与几何意义

原作者视频&#xff1a;【导数】【考点精华】7导数与几何意义考点解析&#xff08;基础&#xff09;_哔哩哔哩_bilibili 该点处切点的斜率 该点处导函数的值 示例1&#xff1a; 导数问题解决最常用方法&#xff1a;参数分离&#xff0c;在左边函数有解的值域范围内。 示例2&…

Jackson-jr 对比 Jackson

关于Jackson-jr 对比 Jackson 的内容&#xff0c;有人在做了一张下面的图。 简单点来说就 Jackson-jr 是Jackson 的轻量级应用&#xff0c;因为我们在很多时候都用不到 Jackson 的很多复杂功能。 对很多应用来说&#xff0c;我们可能只需要使用简单的 JSON 读写即可。 如我们…

微服务总览

微服务保护 微服务总览 微服务总览 接入层&#xff1a;反向代理功能&#xff0c;可以将用户域名访问的地址以负载均衡的方式代理到网关地址&#xff0c;并且并发能力非常高&#xff0c;并且会采用主备nginx的方式防止nginx寄了&#xff0c;备份nginx监控主nginx状态&#xff0c…

CMakeLists.txt 文件内容分析

一. 简介 前一篇文章学习了针对只有一个 .c源文件&#xff0c;cmake工具是如何使用编译的&#xff0c;文章如下&#xff1a; cmake的使用方法:单个源文件的编译-CSDN博客 本文对 所编写的 CMakeLists.txt文件的内容进行分析。从而了解如何编写一个 CMakeLists.txt文件。 二…

ElasticSearch01(ES简介,安装ES,操作索引,操作文档,RestAPI)【全详解】

目录 一、ES简介 1. 数据库查询的问题 2. ES简介 1 ElasticSearch简介 2 ElasticSearch发展 3. 倒排索引【面试】 1 正向索引 2 倒排索引 4. ES和MySql 5. 小结 二、安装ES 1. 方式1:使用docker安装 1 准备工作 2 创建ElasticSearch容器 3 给ElasticSearch配置i…

百度网盘里的文件怎么打印?

在日常生活和工作中&#xff0c;我们经常需要打印各种文件&#xff0c;包括学习资料、工作报告、合同文件等。有时候&#xff0c;这些文件保存在百度网盘等云存储服务中&#xff0c;我们该如何方便地打印出来呢&#xff1f;今天&#xff0c;就为大家介绍一种便捷的方法——通过…

一对一WebRTC视频通话系列(二)——websocket和join信令实现

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客&#xff1a; 一对一WebRTC视频通话系列&#xff08;一&#xff09;—— 创建页面并显示摄像头画面 websocket和join信令…

深入浅出学习Pytorch—Pytorch简介与2024年最新安装(GPU)

深入浅出学习Pytorch—Pytorch简介 学习原因&#xff1a;Pytorch日益增长的发展速度与深度学习时代的迫切需要 Pytorch模型训练 pytorch实现模型训练包括以下的几个方面&#xff08;学习路线&#xff09; 数据&#xff1a;数据预处理与数据增强模型&#xff1a;如何构建模型模…

全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 辅助文档&#xff1a;HTML标签大全&#xff08;实时更新&#xff…

【JVM】从硬件层面和应用层面的有序性和可见性,到Java的volatile和synchronized

Java的关键字volatile保证了有序性和可见性&#xff0c;这里我试着从底层开始讲一下有序性和可见性。 一&#xff0c;一致性 数据如果同时被两个cpu读取了&#xff0c;如何保证数据的一致性&#xff1f;或者换句话说&#xff0c;cpu1改了数据&#xff0c;cpu2的数据就成了无效…

esp32-cam 1. 出厂固件编译与测试

0. 环境 - ubuntu18 - esp32-cam - usb转ttl ch340 硬件连接 esp32-camch340板子U0RTXDU0TRXDGNDGND5V5V 1. 安装依赖 sudo apt-get install vim sudo apt install git sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial p…

【Linux】awk命令学习

最近用的比较多&#xff0c;学习总结一下。 文档地址&#xff1a;https://www.gnu.org/software/gawk/manual/gawk.html 一、awk介绍二、语句结构1.条件控制语句1&#xff09;if2&#xff09;for3&#xff09;while4&#xff09;break&continue&next&exit 2.比较运…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起&#xff1a;因为工作需要&#xff0c;编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统&#xff0c;偶尔还是有必须要用WINDOWS的时候&#xff0c;于是也安装了WIN10。 双系…

软件应用开发安全设计指南

1.1 应用系统架构安全设计要求 设计时要充分考虑到系统架构的稳固性、可维护性和可扩展性&#xff0c;以确保系统在面对各种安全威胁时能够稳定运行。 在设计系统架构时&#xff0c;要充分考虑各种安全威胁&#xff0c;如DDoS攻击、SQL注入、跨站脚本攻击&#xff08;XSS&…

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

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

SpringBoot @DS注解 和 DynamicDataSource自定义实现多数据源的2种实现方式

前言 在实际的项目中&#xff0c;我们经常会遇到需要操作多个数据源的情况&#xff0c;SpringBoot为我们提供了多种实现多数据源的方式。本文将介绍两种常见的方式&#xff1a;使用DS注解实现多数据源的切换以及使用DynamicDataSource自定义实现多数据源的切换。 我们将分别介…

【Unity】在空物体上实现 IPointerClickHandler 不起作用

感谢Unity接口IPointerClickHandler使用说明_哔哩哔哩_bilibiliUnity接口IPointerClickHandler使用说明, 视频播放量 197、弹幕量 0、点赞数 3、投硬币枚数 2、收藏人数 2、转发人数 0, 视频作者 游戏创作大陆, 作者简介 &#xff0c;相关视频&#xff1a;在Unity多场景同时编辑…