SpringBoot(一)【入门】

前言

1、SpringBoot 快速入门

1.1、SpringBoot 简介

  • SpringBoot 是用来简化 Spring 应用的初始搭建以及开发过程

首先我们回顾一下 SpringMVC 项目的开发过程:

  1. 导入依赖(javax.servlet-api 和 spring-webmvc)
  2. Servlet 容器配置类(在这里设置 SpringMVC 来处理所有请求)
  3. SpringMVC 容器配置类
  4. 创建 Controller 类

1.2、SpringBoot 项目创建的两种方式

1.2.1、手动创建

这里我们不再是创建 Maven 工程了,而是创建一个 Spring Initialzr 项目:

然后选择 SpringBoot 版本并勾选 SpringbWeb: 

创建好工程后,我们只需要保留 src 目录和 pom.xml,别的文件都可以删了。

SpringBoot 程序并不需要像开发 SpringMVC 程序那样一上来先创建 ServletConfig、SpringMvcConfig 这些配置类,我们只需要写一个 Controller 类:

@RestController
@RequestMapping("/books")
public class BookController {@GetMapping("/{id}")public String getById(@PathVariable Integer id){System.out.println("id => " + id);return "hello springboot";}}

接着写一个执行类:

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

不用配置 Tomcat 直接执行,然后访问 local:8080/books/1

查看控制台输出: 

恐怖如斯!!!我们啥都没干,就写了一个 Controller 类!!!

1.2.2、Spring 官网创建

打开 start.spring.io

下载项目之后,我们查看 pom.xml:

可以看到,和我们在 Idea 创建的项目 pom.xml 中的核心依赖是一样的,只不过这里的 SpringBoot 版本最低就是 3.2.4 ,JDK 版本必须 JDK17+。

1.3、SpringBoot 快速启动

        SpringBoot 程序可以不依赖 Tomcat 和 Idea 直接运行,但是数据库必须得有。所以前后端开发 Web 程序的过程中,后端程序员只需要给前端程序媛一个 jar 包和数据库建表语句即可。

打包 SpringBoot 项目:

重点是要有这个打包插件:

            <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><addResources>true</addResources><mainClass>com.lyh.Application</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin>

在 idea 用 package 打包程序,在 jar 包目录输入 cmd 使用 java -jar 命令执行并在浏览器访问 localhost:8080/books/1 :

这样我们的项目就可以摆脱对 Idea 和 Tomcat 的依赖随处运行了。

1.4、起步依赖

        为什么 SpringBoot 可以帮我自动处理好依赖之间的关系,而使得我们几乎不需要自己导入任何依赖呢,这其实主要归功于它帮我把所有的依赖都导进来了:

SpringBoot 的三个核心依赖:

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

 我们可以打开查看一下:

        可以看到,光是一个 spring-boot-dependencies 中帮我们管理了接近两百个依赖,而下面的 spring-boot-starter-web 和 spring-boot-starter-test 同样帮我们导入了 tomcat、servlet、springmvc 等依赖。

        所以 SpringBoot 的起步依赖通过帮我们来管理依赖,已达到减少依赖冲突的目的。

1.5、切换 Web 服务器

        上面我们打包的 SpringBoot 程序会内置一个 tomcat,所以我们可以在别的地方运行,这是因为  spring-boot-starter-web 帮我们导入了 tomcat 的依赖,但是如果我们不希望使用 tomcat 又该怎么办?tomcat 是内置的依赖,我们怎么排除掉?

    <!-- 排除tomcat依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- 导入jetty依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId><version>2.5.0</version></dependency>

 启动项目:

        所以,之后当遇到版本依赖需要替换依赖的情况我们都可以这么干!相比较 Tomcat,Jetty 更加轻量级,可扩展性更强。

2、基础配置

2.1、配置文件格式(3种)

2.1.1、修改服务器端口

        现在我们启动的项目端口默认就是 8080,那如果我们要修改的话,就需要进行配置。

  • applicantion.properties
server.port=80
  • 创建一个 application.yml (SpringBoot 项目中我们的配置文件都用 application.x 的格式)
server:port: 80

注意:port: 和 80 之间一定要有空格

  • 创建一个 application.yaml(相比较 application.yml  只是扩展名不同,内容都一样)
server:port: 80

Idea 设置 SpringBoot 配置文件提示功能:

我们之后写 application.yml 更多一些,如果三个文件都存在,则优先级: application.properties  >  application.yml >  application.yaml

2.1.2、yaml

  • YAML (Ain't Markup Language),一种数据序列化格式
  • 优点:
    • 容易阅读
    • 容易与脚本语言交互
    • 以数据为核心,重数据轻格式
  • YAML 扩展名
    • .yml(主流)
    • .yaml

语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾用冒号结束
  • 使用缩进表示属性层级关系,同层级左侧对齐,只允许使用空格(不允许 Tab 键)
  • 属性值前面必须添加空格
  • # 表示注释
  • 数组数据使用 '-' 表示开始 

2.1.3、yaml 数据读取方式(3种)

先在 application.yml 中添加下面的内容 

student:name: tomage: 15subject:- Math- English- Chinese
(1)@Value (直接读取)
    @Value("${student}")private String student;@Value("${server.port}")private Integer port;@Value("${student.subject[0]}")private String subject0;
(2)Environment (封装后读取)
    @Autowiredprivate Environment environment;// 用的时候直接调用System.out.println(environment.getProperty("server.port"));System.out.println(environment.getProperty("student.subject[0]"));
(3)实体类封装(常用)

        在 domain 包下创建一个 Student 对象,这个对象必须被 SpringBoot 管理,所以使用 @Component 注解来标识;而且这里需要指定配置名称,所以用 @ConfigurationProperties 来表示属性名:

@Component
@ConfigurationProperties(prefix = "student")
public class Student {private String name;private Integer age;private String[] subject;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", subject=" + Arrays.toString(subject) +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String[] getSubject() {return subject;}public void setSubject(String[] subject) {this.subject = subject;}
}

用的时候直接用 student 对象的 get 方法即可。

    @Autowiredprivate Student student;// 用的时候调用get方法System.out.println(student.getAge());

包括之后我们配置 Mybatis 也会通过这种方式来配置。

如果遇到对象封装警告,需要导入 Maven 依赖:

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>

2.2、多环境开发

 在不同的环境下我们往往使用的配置不同,那我们应该怎么设置?

 2.2.1、yaml 文件多环境启动 

通过 "---" 来区分不同的环境,通过 spring: profiles: active 来指定我们上线时使用的环境信息:

spring:profiles:active: dev---
# 开发环境
spring:profiles: dev
server:port: 85---
# 生产环境
spring:profiles: pro
server:port: 86---
# 测试环境
spring:profiles: test
server:port: 87

这里的配置过时了,我们也可以换用这种格式:

spring:config:activate:on-profile: dev
server:port: 85

2.2.2、application.properties 文件多环境启动

spring.config.activate.on-profile=dev

创建 application-dev.properties:

server.port=85

创建 application-dev.properties:

server.port=85

 2.2.3、多环境启动命令格式

        在实际开发过程中,我们的程序打包后总是有一个我们指定的环境(比如我们这里的yml文件:spirng.profiles.active: dev)

打包程序(先设置编码格式,防止 SpringBoot 中的配置文件中文乱码,即使是中文注释):

如果打包后的 jar 包只有几 KB,那指定是打包出问题了,看看 pom.xml 中的这里:

测试结果:

普通启动:

我们看到,启动的端口是 85,我们现在指定环境为 test:

java -jar springboot-demo1-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

可以看到,端口被切换为 87 

2.2.4、多环境开发兼容性问题

        在 SpringBoot 和 Maven 都有 profile 配置的情况下,SpringBoot 的配置应该听从于 Maven ,也就是说 Maven 应该占据主导地位。

Maven 中设置多环境属性

    <profiles><!-- 开发环境 --><profile><id>dev</id><properties><profile.active>dev</profile.active></properties></profile><!-- 生产环境 --><profile><id>pro</id><properties><profile.active>pro</profile.active></properties><activation><activeByDefault>true</activeByDefault></activation></profile><!-- 测试环境 --><profile><id>test</id><properties><profile.active>test</profile.active></properties></profile></profiles>

SpringBoot 中引用 Maven 属性

spring:profiles:active: ${profile.active}

对资源文件开启默认占位符的解析

这里需要引入一个插件来将我们 Maven 中配置的<profile.active>属性值加载到 application.yml 中的占位符 ${profile.active} 当中:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version><configuration><encoding>UTF-8</encoding><useDefaultDelimiters>true</useDefaultDelimiters></configuration>
</plugin>

未导入插件前:

导入插件后,我们解压打包好的 jar 包后就会发现Maven中的属性值被成功加载到 application.yml:

2.3、配置文件分类

  • SpringBoot 中4级配置文件等级(从高到低)
    • 1级:config/application.yml(jar包所在目录下的config目录)
    • 2级:application.yml(jar包所在目录)
    • 3级:classpath: config/application.yml(jar包内的路径/Maven工程的resources目录下的config目录)
    • 4级:classpath: application.yml(jar包内的路径/Maven工程的resources目录)

所以,如果我们测试的时候希望修改某个配置属性,可以通过前两种方式对属性进行覆盖。

编辑一个 application.yml:

server:port: 88

 放到 jar 包所在目录

测试: 

可以看到,jar 包内的配置端口=85 被覆盖掉了。

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

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

相关文章

227基于matlab的作业调度问题

基于matlab的作业调度问题。采用遗传算法&#xff0c;解决作业调度问题。一共三个作业&#xff0c;每个作业有不同的时间长度和紧急程度&#xff0c;超过时间会有惩罚措施。通过遗传算法计算出最好的作业安排&#xff0c;使得惩罚最小&#xff0c;获益最大。最终结果通过GUI用甘…

Maven 项目 JDK 8、JDK 17 多版本 Java 编译依赖最佳实践

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

ubuntu下交叉编译ffmpeg到目标架构为aarch架构的系统

Ubuntu下FFmpeg的aarch64-linux-gnu架构交叉编译教程 一、前言 有时候真的很想报警的&#xff0c;嵌入式算法部署花了好多时间了&#xff0c;RKNN 1808真是问题不少&#xff1b;甲方那边也是老是提新要求&#xff0c;真是受不了。 由于做目标检测&#xff0c;在C代码中有对视…

Kingbase(人大金仓数据库)(总结全网精华,虚拟机:从安装到操作数据库一条龙)

前言&#xff1a; 前一阵子一直在捣鼓人大金仓数据库&#xff0c;虽然国产化的数据库很值得夸赞&#xff0c;但是网上的资料确实少的可怜。特此记录一下我在学习这个数据库的心酸历程。 安装就看这个大哥的&#xff0c;我之前安装就是看的他的&#xff0c;非常靠谱。 linux安装…

Embedding例子:简单NN网络、迁移学习例子

一、简单例子&#xff1a;构造简单NN网络生成Embedding 1、pytorch例子 2、tensorflow例子 # 1导入模块 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding import numpy as np# 2构建语料库 corpus[[…

每日两题 / 22. 括号生成 54. 螺旋矩阵(LeetCode热题100)

22. 括号生成 - 力扣&#xff08;LeetCode&#xff09; dfs生成合法的括号序列即可 class Solution { public:vector<string> ans;void dfs(int l, int r, int n, string& s){if (s.size() n * 2){ans.push_back(s);return;}if (l){s "(";dfs(l - 1, …

Burpsuite插件 BurpAPIFinder专为未授权/敏感信息/越权而生

BurpAPIFinder 攻防演练过程中&#xff0c;我们通常会用浏览器访问一些资产&#xff0c;但很多未授权/敏感信息/越权隐匿在已访问接口过html、JS文件等&#xff0c;通过该Burp插件我们可以&#xff1a; 1、发现通过某接口可以进行未授权/越权获取到所有的账号密码、私钥、凭证 …

记录方式重新打开人生

文章目录 引言节省生命感知细节的能力正视痛苦总结 引言 你是否遇到以下问题 时间过得很快&#xff0c;不知道过去在忙什么事情很多很杂&#xff0c;感觉一直都很忙但是好像也没啥收获生活、工作中不顺心的事情很多&#xff0c;心里比较烦躁压抑 那么可以尝试参考《奇特的一…

python环境引用《解读》----- 环境隔离

首先我先讲一下Anaconda&#xff0c;因为我用的是Anaconda进行包管理。方便后面好理解一点。 大家在python中引用环境的时候都会经历下面这一步&#xff1a; 那么好多人就会出现以下问题&#xff08;我就是遇到了这个问题&#xff09;&#xff1a; 我明明下载了包&#xff0c…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.1-1.3

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

阶段性学习汇报 4月19日

一、毕业设计和毕业论文 毕业设计后端功能基本实现&#xff0c;但是还有些具体的细节需要优化&#xff0c;例如这些图片的显示问题&#xff0c;前端只有个前端页面以及部分交互逻辑&#xff0c;还需进一步完善。我想在疾病预测这里加一个创新点&#xff0c;基于推荐算法。小程序…

测绘管理与法律法规 | 中华人民共和国测绘法 | 学习笔记

《中华人民共和国测绘法》笔记&#xff1a; 第一章 总则 第一条&#xff1a;立法目的&#xff0c;即加强测绘管理&#xff0c;促进测绘事业发展&#xff0c;保障测绘事业为经济建设、国防建设、社会发展和生态保护服务&#xff0c;维护国家地理信息安全。 第二条&#xff1a;…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

ollama大语言模型

查看已经安装的大语言模型 ollama list运行大语言模型 ollama run llama2:latest

Qt实现Mysql数据库的连接,查询,修改,删除,增加功能

Qt实现Mysql数据库的连接&#xff0c;查询&#xff0c;修改&#xff0c;删除&#xff0c;增加功能 安装Mysql数据库&#xff0c;QtCreator Mysql选择Mysql Server 8.1版本安装。 Mysql Server 8.1安装过程 1.首先添加网络服务权限&#xff1a; WinR键输入compmgmt.msc进入…

Linux【实战】—— LAMP环境搭建 部署网站

目录 一、介绍 1.1什么是LAMP&#xff1f; 1.2LAMP的作用 二、部署静态网站 2.1 虚拟主机&#xff1a;一台服务器上部署多个网站 2.1.1 安装Apache服务 2.1.2 防火墙配置 2.1.3 准备网站目录 2.1.4 创建网站的配置文件 2.1.5 检查配置文件是否正确 2.1.6 Linux客户端…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

深入理解MySQL中的UPDATE JOIN语句

在MySQL数据库中&#xff0c;UPDATE语句用于修改表中现有的记录。有时&#xff0c;我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATE JOIN语句。最近我们遇到了这样的需求&#xff1a;我们有一张历史记录表&#xff0c;其中一个字段记录了用,连接的多…

【转】关于vsCode创建后,不显示NPM脚本解决

刚刚使用vue ui新建了个vue项目&#xff0c;打开vs-code发现&#xff0c;无论怎么设置都找不到NPM脚本显示&#xff0c;苦恼了很久&#xff0c;突然发现&#xff01;打开了package-lock.json&#xff0c;然后立马把vs-code关闭&#xff0c;重新打开&#xff0c;就显示了npm脚本…

DePT: Decoupled Prompt Tuning 论文阅读

DePT: Decoupled Prompt Tuning 了论文阅读 Abstract1. Introduction2. Methodology2.1. Preliminaries2.2. A Closer Look at the BNT Problem2.3. Decoupled Prompt Tuning 3. Experiments5. Conclusions 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/…