SpringBoot 入门
SpringBoot 的主要特点为:
- 创建独立的 Spring 应用程序
- 嵌入到 Tomcat,无需部署 WAR 文件
- 简化 Maven 配置
- 自动配置Spring
- 提供生产就绪型功能,如指标,健康检查和外部配置
- 绝对没有代码生成并且对 XML 也没有配置要求
SpringBoot 配置文件
配置文件的路径及优先级
配置文件的路径
SpringBoot 使用了一个全局的配置文application.properties,该配置文件可以放置在以下几个位置:
- 根目录下
- 项目根目录中 config 目录下
- 项目的 resources 目录下
- 项目 resources 目录中config 目录下
配置文件的优先级
经过测试,SpringBoot 项目中配置文件的读取顺序为:
- config/application.properties(项目根目录中 config 目录下)
- application.properties(项目根目录下)
- resources/config/application.properties(项目 resources 目录中 config 目录下)
- resources/application.properties(项目的 resources 目录下)
注意:
- 如果同一个目录下,有 application.yml 也有 application.properties,默认先读取application.properties。
- 如果同一个配置属性,在多个配置文件都配置了,默认使用第 1 个读取到的,后面读取的不覆盖前
面读取到的。- 创建 SpringBoot 项目时,一般的配置文件放置在“项目的 resources 目录下”
配置文件的两种文件格式
properties 文件
application.properties 遵循属性文件的编写规则如下:
##端口号
server.port=8083
##项目默认访问路径
server.servlet.context-path=/ysd
yaml(yml)文件
YAML 有以下基本规则:
- 大小写敏感
- 用缩进表示层级关系
- 禁止使用 tab 缩进,只能使用空格键
- 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
- 使用#表示注释
- 字符串可以不用引号标注
yaml 文件的示例如下:
server:
port: 8083
servlet:
context-path: /ysd
注意:
自上而下组成的分级名必须唯一,比如这里第一级有 server 则不能再有另外一个一级名为 server的配置信息,:号后面要有空格。 这种格式的文件更直观更简洁,推荐采用 yml 格式书写配置文件。
SpringBoot 多环境配置
多环境配置的引入
在上一章节中,我们已经了解了配置文件的作用,即定义一些特有的配置属性和修改一些默认值。通常定义的配置文件是 application.properties 或 application.yml,SpringBoot 项目会自动识别该配置文件。同时,该配置文件可以放置到项目的根目录下、项目根目录下的 config 目录下、src/main/resources 目录下以及src/main/resources/config 目录下。
但是,在项目的整个研发过程中,同一个项目会面临着不同的使用环境。使用环境不同,需要的配置信息也会不同。例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据库。如果在项目中只有 application.properties(application.yml)一个配置文件的话,该文件中的属性值会经常需要改动,就会使项目整体的体验变得非常差,而且出错率也极高。这时候,我们可以用 profile 在不同的环境下配置不同的配置文件。这样一来,在 SpringBoot 项目中就出现了多环境的配置文件。
多环境配置的设置
开发环境(application-dev.properties):
#开发环境
#tomcat 服务器端口
server.port=8081
生产环境(application-prod.properties):
#生产环境
#tomcat 服务器端口
server.port=8082
测试环境(application-test.properties):
#测试环境
#tomcat 服务器端口
server.port=8083
默认环境(application.properties):
#主配置文件,配置了这个会优先读取里面的属性覆盖主配置文件的属性
spring.profiles.active=dev #项目会应用开发环境中的服务器端口号 8081
#tomcat 服务器端口(默认)
server.port=8080
多环境配置文件可以和 application.properties 文件一样放置在项目中四个位置的任何一处。本实例中,将以上四个配置文件都放置在项目的 src /main/resources 目录下面,如果没有 resources 目录,需手动新建一个。
多环境配置的切换
通过在 application.properties 中,设置 spring.profiles.active 来具体激活一个或者多个配置文件,如果没有指定任何 profile 的配置文件的话,springboot 默认会启动applicationdefault.properties。下面的实例是启动开发环境的配置文件,需要在 application.properties 中,设置如下的命令即可。
spring.profiles.active=dev #dev 就是配置文件名中间的名称
启动项目,在浏览器中输入`http://localhost:8081/index’就可以完成相应的操作了。大家可以采用其他方式更换到其他环境下。
注意:
其他配置文件中相同的属性会覆盖主配置文件中的属性,如端口号是开发环境中的 8081,而不是默认的 8080。
命令行设置属性值
其实,除了通过设置配置文件来修改属性值外,还可以通过命令行来修改属性值。在命令行运行时,连续的两个减号–就是对 application.properties 中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在 application.properties 中添加属性 server.port=8888。
通过命令行来修改属性值确实比较便利,但是通过命令行就能更改应用运行的参数,对于项目的安全性构成了一定的威胁。所以 SpringBoot 框架中也提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。 具体设置如下:
package com.roncoo.education;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDemo41Application {
public static void main(String[] args) {
//SpringApplication.run(SpringBootDemo41Application.class, args);
SpringApplication springApplication = new
SpringApplication(SpringBootDemo41Application.class);
//禁止命令行设置参数
springApplication.setAddCommandLineProperties(false);
springApplication.run(args);
}
}
备注:命令行更改属性值的优先级最高。
自定义属性
自定义的属性可以放到 application.properties(或 application.yml)全局配置文件中,也可以在自定义的其
他配置文件中定义。本课程以自定义的 stu.properties 为例。
配置文件中自定义属性
##学生类自定义属性
student.name=Tom
student.age=22
student.birthday=1996/01/10
student.sex=true
student.hobbies[0]=swimming
student.hobbies[1]=basketball
student.skills[0]=programming
student.skills[1]=test
student.address.province=henan
student.address.city=zhengzhou
绑定属性值
定义一个 Student 类需要添加@Component 注解,让 spring 在启动的时候扫描到该类,并添加到 spring 容器中。接下来为各个属性绑定值,通常有两种方法可以实现:一种@Value,另一种是@ConfigurationProperties。
/**
* 学生类
* @author wwp
*
*/
@Component
@PropertySource({"classpath:stu.properties"}) //指定配置文件的位置
public class Student {
private String name;//姓名
private int age;//年龄
private boolean sex;//性别
private Date birthday;//生日
private String[] hobbies;//爱好
private List<String> skills;//技能
private Map<String,Object> address;//住址
//getter 和 setter 方法
... }
注意:@PropertySource 用于指定配置文件的位置,需要注意的是只能指定后缀为 properties 的配置文件,不能指定 yaml 文件。
@Value 的使用
@Value 注解可以绑定属性值,但是只能绑定简单类型的属性值,通常通过 SqEL 方式绑定。具体用法:@Value属性名,在属性名上添加该注解,如:
@Value("${my.name}")
private String myName;
使用@Value+@PropertySource 读取其它配置文件(多个)内容,读取 application.properties 配置。实体类代码如下:
@Component
@PropertySource({"classpath:stu.properties"}) //指定配置文件的位置
public class Student {
}
ConfigurationProperties 的使用
@Component
@ConfigurationProperties(prefix="student") //该注解放在类上面
@PropertySource({"classpath:stu.properties"})//指定配置文件的位置
public class Student {
@Value("Marry")
private String name; //姓名
private int age; //年龄
private boolean sex; //性别
private Date birthday; //生日
private String[] hobbies; //爱好
private List<String> skills; //技能
private Map<String,Object> address; //住址
//getter 和 setter 方法...
}
小结
@ConfigurationProperties 用于批量注入值,可以和@Value 一块使用,两者可以互补,@ConfigurationProperties 的优先级高于@Value。
@ConfigurationProperties 和@Value 优缺点
- 可以从配置文件中批量注入属性;
- 支持获取复杂的数据类型;
- 对属性名匹配的要求较低,比如 user-name,user_name,userName,USER_NAME 都可以取值;
- 支持 JAVA 的 JSR303 数据校验;
- 缺点是不支持强大的 SpEL 表达式;
@Value 注解的优缺点正好相反,它只能一个个配置注入值;不支持数组、集合等复杂的数据类型;不支持数据校验;对属性名匹配有严格的要求。最大的特点是支持 SpEL 表达式,使其拥有更丰富的功能。\
随机数配置
定义随机数
在项目的 resources/config 目录下添加 random.properties 文件,添加以下内容:
#随机 32 位 MD5 字符串
user.random.secret=${random.value}
#随机 int 数字
user.random.intNumber=${random.int}
#随机 long 数字
user.random.longNumber=${random.long}
#随机 uuid
user.random.uuid=${random.uuid}
#随机 10 以内的数字
user.random.lessTen=${random.int(10)}
#随机 1024~65536 之内的数字
user.random.range=${random.int[1024,65536]}
注意
- 位符的值必须是完整路径
- 占位符设置默认值,冒号后面不能有空格
绑定属性值
定义 RandomConfig 类,使用@ConfigurationProperties 绑定属性值。代码如下所示:
@Component
@ConfigurationProperties(prefix = "user.random")
@PropertySource(value = { "classpath:config/random.properties" })//指定配置文件的位置
public class RandomConfig {
private String secret;
private int intNumber;
private int lessTen;
private int range;
private long longNumber;
private String uuid;
//getter 和 setter 方法...
}
最后总结 SpringBoot 的配置文件如下:
- Spring Boot 支持两种格式的配置文件,其中 YAML 的数据结构比 properties 更清晰。
- YAML 是专门用来写配置文件的语言,非常简洁和强大。
- YAML 对空格的要求很严格,且不能用 Tab 键代替。
- YAML 通过空格缩进的程度确定层级,冒号后面有空格,短横线后面有空格。
- @ConfigurationProperties 注解适合批量注入配置文件中的属性,@Value 注解适合获取配置文件中的某一项。
- @ConfigurationProperties 注解支持数据校验和获取复杂的数据,@Value 注解支持 SpEL 表达式。