文章目录
1. 环境
1.1 环境配置
- 环境约束:
jdk 1.8
maven 3.6.0
IntelliJIDEA2017
-
Spring Boot 环境配置 博主写的非常详细!!
-
由于我下载的IDEA是2017.3.1,版本和目前maven最新版本3.8.0 不匹配,会报
Unable to import maven project
错误,因此去下载了3.6.0版本,maven-3.6.0 下载地址。
1.2 helloworld 实例
- 创建Spring Initializr 项目:
Create New Project —> Spring Initializr (选择SDK,版本要求1.8+)—> 填写项目信息 —> 选择初始化的组件【勾选Web依赖】 —> 选择项目的位置,点击【Finish】
- 项目结构如下 :
SpringbootApplication
: 一个带有 main() 方法的类,用于启动应用程序SpringbootApplicationTests
:一个空的 Junit 测试了,它加载了一个使用 Spring Boot 字典配置功能的 Spring 应用程序上下文application.properties
:一个空的 properties 文件,可以根据需要添加配置属性pom.xml
: Maven 构建说明文件
2. 运行原理
2.1 Pom.xml
文件内容如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zou</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
父依赖
<parent>
标签配置着 Spring Boot 的父级依赖,有了这个,当前项目才是Spring Boot 项目。spring-boot-starter-parent
是一个特殊的 starter ,它用来提供相关的 Maven 默认依赖,使用它之后,常用的包依赖就可以省去 version 标签。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
启动器
spring-boot-starter - xxx
:场景启动器,xxx代表某种场景。- SpringBoot 将所有的功能场景都抽取出来,做成一个个 start 启动器,只要在项目中引入了某个 starter,这个场景的所有常规需要的依赖都会自动引入。
<!-- -web 帮我们导入了web模块正常运行所依赖的组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 应用入口类 @SpringBootApplication
Spring Boot 项目通常有一个名为 *Application
的入口类,入口类里有一个 main 方法, 这个 main 方法其实就是一个标准的 Java 应用的入口方法。
标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
Spring Boot 的核心注解,他是一个组合注解,该注解组合了:@Configuration
、@EnableAutoConfiguration
、@ComponentScan
; 若不是用 @SpringBootApplication
注解也可以使用这三个注解代替。
-
@EnableAutoConfiguration
: 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置。 例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么 Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。 -
@ComponentScan
: 对应XML配置中的元素。
作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中。 -
@Configuration
:说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件。
3. 配置文件
3.1 配置文件介绍
Spring Boot 使用一个全局的配置文件 ,
- application.properties
语法结构:key=value
- application.yml
语法结构:key: value
(冒号后面有个空格!)
存放位置:【src/main/resources】目录或者类路径的 /config 下。
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了。
3.2 YAML概述
yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。
基本语法
k:(空格)v
:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
server:
port: 8081
path: /hello
值的写法
- 字面量:普通的值(数字、字符串、布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;
特殊字符会作为本身想表示的意思
’’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: "zhangsan \n lisi": 输出;zhangsan 换行 lisi
name: ‘zhangsan \n lisi’: 输出;zhangsan \n lisi
- 对象、Map(属性和值)(键值对)
k: v:在下一行来写对象的属性和值的关系;注意缩进。
# 块写法
friends:
lastName: zhangsan
age: 20
# 行内写法
friends: {lastName: zhangsan,age: 18}
- 数组(List、Set)
用- 值 表示数组中的一个元素
# 块写法
pets:
‐ cat
‐ dog
‐ pig
# 行内写法
pets: [cat,dog,pig]
3.3 注入配置文件
- 在springboot 项目中的 resources 目录下新建一个文件 application.yml
- 在 pojo 包下创建 Dog 类
package com.zou.springboot.pojo;
import org.springframework.stereotype.Component;
@Component //注册bean到容器中
public class Dog {
private String name;
private String age;
//有参无参构造、get、set方法、toString()方法
public Dog() {
}
public Dog(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
- 采用
@Value
方法,给bean注入属性值
@Component //注册bean
public class Dog {
@Value("阿黄")
private String name;
@Value("18")
private String age;
- 在SpringBoot 的测试类下注入狗狗输出一下
@SpringBootTest
public class DemoApplicationTests {
@Autowired //将狗狗自动注册进来
Dog dog;
@Test
public void contextLoads(){
System.out.println(dog); //打印查看狗狗对象
}
}
5. 编写一个复杂的实体类: Person类
@Component // 注册bean
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
//有参无参构造、get、set方法、toString()方法
}
- 使用yaml配置的方法进行注入
person:
name: 邹小胖
age: 20
happy: true
birth: 2000/09/28
maps: {k1: v1,k2: v2}
lists:
- krystal
- 连小伟
dog:
name: 旺财
age: 1
- 把person这个对象的所有值,注入到我们的类中!
@ConfigurationProperties
作用:
- 将配置文件中配置的每一个属性的值,映射到这个组件中;
- 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
- 参数
prefix = “person”
: 将配置文件中的person下面的所有属性一一对应
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
- IDEA 提示,springboot配置注解处理器没有找到,需要一个依赖!
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 去测试类中进行测试
@SpringBootTest
public class DemoApplicationTests {
@Autowired
Person person;
@Test
public void contextLoads(){
System.out.println(person);
}
}
注: 将配置文件的key 值 和 属性的值设置为不一样,则结果输出为null,注入失败
3.4 加载指定配置文件
@PropertySource
:加载指定的配置文件;
@configurationProperties
:默认从全局配置文件中获取值;
- 在resources目录下新建一个person.properties文件
name=邹小胖
- 在 Person.class 中指定加载 person.properties 文件
@Component
@PropertySource(value="classpath:person.properties")
public class Person {
@Value("${name}")
private String name;
private Integer age;
·······
}
4. 配置文件补充
4.1 JSR303 数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
实例
例:写个注解让 name 只能支持Email格式
- 在 pom.xml 添加依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.0.Final</version>
</dependency>
- 编写代码
@Component
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误")
private String name;
······
}
常见的检查
空值检查
- @Null 验证对象是否为null
- @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
- @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
- @NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
- @AssertTrue 验证 Boolean 对象是否为 true
- @AssertFalse 验证 Boolean 对象是否为 false
长度检查
- @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
- @Length(min=, max=) string is between min and max included.
日期检查
- @Past 验证 Date 和 Calendar 对象是否在当前时间之前
- @Future 验证 Date 和 Calendar 对象是否在当前时间之后
- @Pattern 验证 String 对象是否符合正则表达式的规则
4.2 yaml 和 properties 对比
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
4.3 多环境切换
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
多配制文件
在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
, 用来指定多个环境版本;
例如:application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;需要通过一个因此配置来选择需要激活的环境:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev
yml的多文档块
使用yml去实现不需要创建多个配置文件
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
config:
activate:
on-profile: dev #配置环境的名称
---
server:
port: 8084
spring:
config:
activate:
on-profile: prod #配置环境的名称
4.4 配置文件加载位置
springboot 启动会扫描以下位置的application.properties
或者application.yml
文件作为Spring boot的默认配置文件
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;