SpringBoot 01:入门与基础配置
简介
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
Spring与Spring Boot对比
Spring: Spring框架是最流行的Java应用程序开发框架。 Spring框架的主要功能是依赖注入或控制反转(IoC)。借助Spring Framework,我们可以开发一个松耦合的应用程序。如果纯粹定义应用程序类型或特征,最好使用。
SpringBoot: Spring Boot是Spring Framework的模块。它允许我们构建具有最少配置或零配置的独立应用程序。如果我们要开发一个简单的基于Spring的应用程序或RESTful服务,最好使用它。
我们使用传统的Spring框架存在许多缺点:
- 需要引入很多包
- 需要进行很多XML的配置,例如Spring/Spring MVC的XML、MyBatis的XML等
而Spring boot就是为了解决使用Spring遇到的上述缺点而设计的
原则:约定优于配置
让开发人员由更多时间来关注业务逻辑
| 类/配置文件 | Spring | SpringBoot |
|---|---|---|
| pom文件中的坐标 | 手工添加 | 勾选添加 |
| web3.0配置类 | 手工制作 | 无 |
| Spring/SpringMVC配置类 | 手工制作 | 无 |
| 控制器 | 手工制作 | 手工制作 |
注意事项:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构
SpringBoot的特点
- 项目只要引入Spring boot即可,Spring boot负责配置其他的框架
- starters管理自动依赖和版本控制
- 自动配置,有默认值,必要时可以修改默认值,不需要自己些xml,也不需要写代码
- 开箱即用
- 非业务功能的特性由Spring Boot提供,如安全、指标、生产环境监控等
- 支持云计算
- Springboot本质是提供了更加便捷的Spring的使用方式,其底层还是SpringFramework实现的
入门程序
1.创建新模块,选择Spring初始化,并配置模块相关基础信息。


2.选择当前模块需要使用的技术集

3.开发控制器类
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println("id ==> "+ id);
return "hello , spring boot! ";
}
}
4.运行自动化生成的Application类

前后端分离情况
当我们的项目为前后端分离时,为了能够使前端的同学能够快速打开我们的java项目,我们应当找到一个方法来快速启动springboot项目。
快速启动SpringBoot项目
1.对SpringBoot项目打包(执行Maven构建指令package)

2.执行启动指令
java –jar springboot.jar
jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
SpringBoot概述
SpringBoot正是因为帮我们配置了一系列starter依赖,所以才让我们的开发变得简便。听我说,谢谢你,boot侠!
起步依赖

这些都是springboot提供的依赖,已经帮我们写好了各种各样的jar包依赖,包括版本号、artifactId、gourpId等。
starter
- SpringBoot中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
parent
所有SpringBoot项目要继承的项目,定义了若干个坐标 版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
不同版本的SpringBoot所使用的依赖差别较大,例如:spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同
注意
- 使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供
- 如发生坐标错误,再指定version(要小心版本冲突)
SpringBoot程序启动
启动方式
@SpringBootApplication
public class Springboot01QuickstartApplication {
public static void main(String[] args) {
SpringApplication.*run*(Springboot01QuickstartApplication.class, args);
}
}
- SpringBoot在创建项目时,采用jar的打包方式
- SpringBoot的引导类是项目的入口,运行main方法就可以启动项目
使用maven依赖管理变更起步依赖项
原来的tomcat用吐了,来换一个jetty服务器吧
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty。
基本配置
如何修改服务器默认端口?(例如8080端口 -> 80端口)
答:采用配置文件修改
第一种配置文件格式:修改resources目录下的配置文件application.properties
server.port=80
第二种配置文件格式:新建一个yml配置文件
server:
port: 80
第三种配置文件格式:新建一个yaml配置文件
server:
port: 80

这样端口修改成功,就可以通过localhost的80端口直接访问了。
以后再开发中,我们主要写yml这种配置文件格式。
如果三种配置文件都存在,谁生效?
答:properties优先级最高,其次yml,最后yaml。
注意事项:SpringBoot内置属性过多,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性。
yaml格式
YAML是”YAML Ain’t Markup Language”(YAML不是一种标记语言)的递归缩写,然而开发这种语言时,YAML的意思其实是”Yet Another Markup Language”(仍是一种标记语言),本质其实是一种数据序列化格式
优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据 轻格式
YAML文件扩展名
- yml(主流)
- yaml
yaml语法规则
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
#表示注释普通的值,包括数字,字符串,布尔值
- 字符串,字符串默认不加引号。如果需要的字符串本身就是一个数字,或者布尔值,需要使用引号(单引号or双引号)。双引号引起的内容,支持特殊字符转义,例如”aaa \n bbb”。单引号引起的内容,不支持特殊字符转义。如果字符串中包含[ ] -> 用于表示结构的字符,需要使用引号、单引号。
对象,有key-value写法,行内写法
核心规则:数据前面要加空格与冒号隔开
spring:
aop:
auto: on
info:
build:
encoding: utf-8
dao:
exceptiontranslation:
enabled: on
Spring boot 获取数据
yaml数组数据
数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔。
student:
name: 银色回廊
age: 100
tel: 13888888888
subject:
- java
- 后端
- 数据库
- 算法
spring boot读取yaml数据
@RestController
@RequestMapping("/books")
public class BookController {
@Value("${student.name}")
private String Name;
@Value("${student.subject[0]}")
private String subject_00;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println(Name);
System.out.println(subject_00);
return "hello , spring boot!";
}
}
environment自动装配数据
通过Environment类可以实现从配置文件读取数据到Environment类中,然后中这个类中获取数据
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Environment environment;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println(environment.getProperty("environment.getProperty("student.name")"));
System.out.println(environment.getProperty("environment.getProperty("student.age")"));
System.out.println(environment.getProperty("environment.getProperty("student.tel")"));
System.out.println(environment.getProperty("environment.getProperty("student.subject[0]")"));
return "hello , spring boot!";
}
}
自定义对象封装注入数据
新建一个domain包,创建student类,读取配置文件中指定名称的数据,进行匹配
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private String name;
private Integer age;
private String tel;
private String[] subject;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", tel='" + tel + '\'' +
", 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 getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String[] getSubject() {
return subject;
}
public void setSubject(String[] subject) {
this.subject = subject;
}
}
再看Controller类中,通过Environment获取配置文件中的内容
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Student student;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println(student);
return "hello , spring boot!";
}
}
自定义封装可能会出现一个警告,只要加上一个依赖就可以解决
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
对注入的数据进行JSR303数据校验
首先引入一个依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
在@ConfigurationProperties数据注入模式下,对对应的属性进行校验
注意事项:@Value 与 @ConfigurationProperties的区别
| 项目 | @ConfigurationProperties | @Value |
|---|---|---|
| 作用 | 用于整个对象的注入,要求变量名与key值对应 | 单个值的注入,不要求变量名与key值对应 |
| 松散结构映射 | 是 | 否 |
| SPEL | 否 | 是 |
| JSR303数据校验 | 是 | 否 |
| 符合数据类型 | 支持 | 不支持 |
多环境开发配置
yaml文件格式
# 设置启动环境
spring:
profiles:
active: dev
# 以前的写法
---
# 开发
spring:
profiles: dev
server:
port: 80
---
# 生产
spring:
profiles: pro
server:
port: 81
---
# 测试
spring:
profiles: test
server:
port: 82
---
# 新版写法(推荐)
# 开发(新版写法)
spring:
config:
activate:
on-profile: dev1
server:
port: 80
properties多文件格式
主启动配置文件application.properties
spring.profiles.active=pro
环境分类配置文件application-pro.properties
server.port=80
环境分类配置文件application-dev.properties
server.port=81
环境分类配置文件application-test.properties
server.port=82
在application.properties / application.yaml / application.yml 以外建立配置文件
需要在要注入数据的类上添加以下注解
@PropertySource(value = {"classpath:<其他配置文件路径和名字>"})
另外,Spring Boot能够像Spring一样应用XML格式的配置文件和类,需要在启动类添加注解
@ImportResource(locations = {"classpath:<其他配置文件路径和名字>"})
当然,纯注解的配置类加上@Configuration,@Bean也是支持的。
多环境启动
当开发的环境转移到测试的环境时需要进行对应的修改,对已经打包的文件,我们可以使用多环境启动格式来进行配置。
启动格式:
带参数启动SpringBoot
java –jar springboot.jar –-spring.profiles.active=test
当要临时改端口时
java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test
参数加载优先顺序

Application Properties
16类配置参数项文档(Application Properties):Spring properties
作用:自动配置(见Springboot02:@EnableAutoConfiguration)
传入参数为多个环境的情况
在启动一个Spring应用程序的时候,可以传入一个或多个环境。-Dspring.profiles.active=test,master,那最终会以哪个为准呢?
先合并配置,如果有冲突,后面的覆盖前面的。
配置文件分类
SpringBoot中4级配置文件
1级: (target的上一层:<current_dir>)/config/(xx/)application.yml 【最高】
2级: (target的上一层:<current_dir>)/application.yml
3级:<classpath>/config/application.yml
4级:<classpath>/application.yml 【最低】
作用:
- 1级与2级留做系统打包后设置通用属性
- 3级与4级用于系统开发阶段设置通用属性
配置文件中的占位符和随机符
占位符
让配置文件中,当前属性能够访问其他属性,这个时候需要用到占位符。
a=silvercorridors.cf
b=blog.${a}
此时a就被当作了占位符,b的值就为blog.silvercorridors.cf
如果事先没有a这个属性的值,可以在占位符中添加默认的缺省值(default_value)
b=blog.${a:silvercorridors.cf}
这样写,b的值也为blog.silvercorridors.cf
随机符
当配置文件中需要让一个key产生随机的value,需要用到随机符${radom.xxx}
r1=${random.int} # 产生一个int型随机数 32位
r2=${random.long} # 产生一个long型随机数 64位
r3=${random.long(100)} # 产生一个100以内的long型随机数 0-99
r4=${random.long[101,200]} # 产生一个101~200范围内的long型随机数 101~200
r5=${random.value} # 随机产生一个md5值
r6=${random.uuid} # 随机产生一个uuid值
r7=id${random.int[101,999]} # 支持字符串拼接
SpringBoot 整合MyBatis
①:创建新模块,选择Spring初始化,并配置模块相关基础信息
②:选择当前模块需要使用的技术集(MyBatis、MySQL)
③:设置数据源参数
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///travel
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
- 注意:SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区,或在MySQL数据库端配置时区解决此问题
④:定义数据层接口与映射配置
@Mapper
public interface userDao {
@Select("select * from user")
void getAllUsers();
}
⑤:测试类中注入dao接口,测试功能
@SpringBootTest
class Springboot05MybatisApplicationTests {
@Autowired
private userDao userDao;
@Test
void contextLoads() {
List<User> allUsers =
userDao.getAllUsers();
allUsers.forEach(System.out::println);
}
}
运行结果:

SpringBoot真的很方便。
知识点:Spring Boot实现热部署
什么是热部署?
热部署,就是在应用正在运行的时候升级软件(增加业务/修改bug),却不需要重新启动应用。
大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各种信息,然后Class文件将被虚拟机的ClassLoader加载。
而热部署正是利用了这个特点,它监听到如果有Class 文件改动了,就会创建一个新的 ClaassLoader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前,Spring Boot通过配置DevTools工具来达到热部署效果。
原理:使用了两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方Jar包),另一-个
ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新创建一一个 restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
环境配置
1.配置devtools环境
(1)在springboot项目中添加devtools依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
(2)同时在plugin中添加devtools生效标志:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
devtools可以实现页面热部署( 即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现) , 实现类文件热部署(类文件修改后不会立即生效), 实现对属性文件的热部署。
即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的虚拟机机制,该项重启是很快的。配置了后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启. (速度比较快的项目重启), 会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。
默认情况下,/META-INF/maven, /META-INF/resources, /resources, /static, /templates, /public 这些文件夹下的文件修改不会使应用重启,但是会重新加载( devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)
2.全局配置文件配置
在application.yml文件中配置spring.devtools.restart.enabled,如下:
#开启热部署
devtools:
restart:
enabled: true
###设置重启的目录
additional-paths: src/main/java
###解决项目自动重新编译后接口报404的问题
poll-interval: 3000
quiet-period: 1000
3.idea设置
当我们修改了Java类后,IDEA 默认是不自动编译的,而spring boot devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译。
(1)自动编译配置

(2)设置自动修改

(3)测试
测试代码controller类
@Controller
public class MyController {
@RequestMapping("/r1")
@ResponseBody
public String r1(){
return "Hello World, r1 here!";
}
}

修改测试代码,点击图标,或者ctrl+F9实现热部署重新加载

热部署成功实现

知识点:SpringBoot常见项目结构

项目根目录/src/main/java:放置项目Java源代码项目根目录/src/main/resources:放置项目静态资源和配置文件项目根目录/src/test/java:放置项目测试用例代码
代码层结构
|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
|__consist:存放常量定义
|__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
|__entity:放置数据库实体对象定义
|__dto:存放数据传输对象定义
|__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
|__intf:存放业务逻辑接口定义
|__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码
资源文件结构
|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
|__js:
|__css:
|__img:
|__font:
|__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
|__header
|__sidebar
|__bottom
|__XXX.html等等
|_application.yml 基本配置文件
|_application-dev.yml 开发环境配置文件
|_application-test.yml 测试环境配置文件
|_application-prod.yml 生产环境配置文件