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: 8101person:name: allen wangage: 30

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

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

数组配置方式一: 

server:port: 8080persons:personList:- name: zhang sanage: 80- name: li siage: 20

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

server:port: 8080persons: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;
        @Autowiredprivate 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.mzph.cn/diannao/6215.shtml

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

相关文章

使用node调用chrome(基于selenium-webdriver包)

下载测试版chrome和chromedriver https://googlechromelabs.github.io/chrome-for-testing/ 把chromedriver复制到chrome的文件里 设置环境变量 编写代码 const { Builder, Browser, By, Key, until } require(selenium-webdriver) const puppeteer require(puppeteer)//查…

2024/5/2 英语每日一段

Enablers’ fate is inherently linked to adopters, which are their ultimate customers, after all. That dynamic won’t flip overnight, but adopters able to demonstrate progress on AI initiatives will increasingly get credit from investors in the form of high…

基于SSM的“一汽租车辆共享平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“一汽租车辆共享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 租车界面 订单管理界面 财务报表界面 理赔界面 …

I/O体系结构和设备驱动程序

I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。 所有计算机都拥有一条系统总线&#xff0c;它连接大部分内部…

Java | Leetcode Java题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n obstacleGrid.length, m obstacleGrid[0].length;int[] f new int[m];f[0] obstacleGrid[0][0] 0 ? 1 : 0;for (int i 0; i < n; i) {for (i…

二叉树的递归详解:以例题计算二叉树第k层为例

1.代码速览 1.1节点的构建 #include<iostream> using namespace std; class ListNode { public:friend void fun();friend int TreeKLevel(ListNode* root, int k);ListNode(int val):_val(val),leftnext(nullptr),rightnext(nullptr){} private:int _val 0;class Lis…

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…

240503-关于VisualStudio2022社区版的二三事

240503-关于VisualStudio2022社区版的二三事 1 常用快捷键 快捷键描述AltEnter选中代码片段以提取方法Alt上下箭头移动选中的代码片段F12转到方法定义CtrlR*2批量修改选中的变量名称 2 自动生成构造函数 3 快速重写父类方法 4 节约时间&#xff1a;写代码使用“头插法”&…

华为OD机试 - 会议室占用时间段(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

【iOS】pthread、NSThread

文章目录 前言一、pthread 使用方法pthread 其他相关方法 二、 NSThread创建、启动线程线程相关用法线程状态控制方法NSThread 线程安全和线程同步场景 线程的状态转换 前言 五一这两天准备将GCD相关的知识完&#xff0c;同时NSOperation与NSThread、pthread也是相关知识&…

前端Web开发基础知识

HTML定义 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 什么是 HTML? HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup LanguageH…

汇编语言——比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示MATCH, 不相同则显示NO MATCH

CMPS 串比较指令&#xff1a; CMPS SRC, DST CMPSB &#xff08;字节&#xff09; CMPSW &#xff08;字&#xff09; 执行操作&#xff1a; ((SI)) - ((DI)) 根据比较结果置条件标志位&#xff1a;相等 ZF1&#xff1b;不等 ZF0 字节操作&#xff1a;(SI)←(SI)1, (DI)←(DI…

window 安装ai 基础环境(yolo8,训练推理等)

步骤: 1. python sdk 3.9以上 2. 显卡驱动 可以使用驱动精灵 直接安装N 卡推荐 3. 安装机器学习套件CUDA cuda 安装在PyTorch 需要根 PyTorch版本一致&#xff0c;我的 win-srv 最高支持 12.1 下载地址&#xff1a; https://developer.nvidia.com/cuda-toolkit-archive…

数据结构——循环结构:for循环

今天是星期五&#xff0c;明天休息&#xff0c;后天补课&#xff0c;然后就是运动会&#xff0c;接着是放假。&#xff08;但这些都和我没关系啊&#xff0c;哭死&#xff01;&#xff09;今天脑袋难得清醒一会儿&#xff0c;主要是醒的比较早吧&#xff0c;早起学了一会&#…

汇编语言——输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来

文章目录 以2进制输入&#xff0c;2进制输出&#xff08;无符号&#xff09;以2进制输入&#xff0c;2进制输出&#xff08;带符号&#xff09;以8进制输入&#xff0c;8进制输出以10进制输入&#xff0c;10进制输出以16进制输入&#xff0c;16进制输出 仅供参考 X、Y的输入可…

Windows系统启动Redis

一、下载windows版本Redis 1.1 选择一个使用的版本 在以下地址中选择一个Windows系统可以使用的版本 https://github.com/microsoftarchive/redis/tags 1.2 下载 1.3 解压到文件夹 二、启动Redis 双击redis-server.exe启动Redis 出现以下界面即启动成功 三、测试是否可以使…

Linux第二节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;&#xff0c;本节涉及初识Linux第二节&#xff0c;主要为常见的几条指令介绍。 Linux下基本指令 1. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#…

某米社区请求data类型multipart_form-data分析

随笔记录 之前未曾遇到请求的Content-Type:multipart/form-data; boundary=----WebKitFormBoundary9Fxpi3Dvlnhm3MKq,今天就简单是根据目标网站进行分析下,目标站点是:aHR0cHM6Ly93ZWIudmlwLm1pdWkuY29tL3BhZ2UvaW5mby9taW8vbWlvL3BjU2VhcmNoP2Zyb21QYXRobmFtZT1taW9Cb2FyZ…

边缘计算含义与应用简析

边缘计算概述 边缘计算使数据存储和处理靠近生成或收集数据的位置&#xff0c;而不是在位于数千公里的服务器上。它将通过保持灵活性在边缘无缝可靠地部署服务。它比云计算更安全&#xff0c;因为不需要传输数据。因此&#xff0c;在将数据从边缘移动到云端时&#xff0c;不用…

eSIM Network搭建指南

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot).