SpringBoot入门和配置(配置文件的路径及优先级,多环境配置,自定义属性)

SpringBoot 入门

SpringBoot 的主要特点为:

  • 创建独立的 Spring 应用程序
  • 嵌入到 Tomcat,无需部署 WAR 文件
  • 简化 Maven 配置
  • 自动配置Spring
  • 提供生产就绪型功能,如指标,健康检查和外部配置
  • 绝对没有代码生成并且对 XML 也没有配置要求

SpringBoot下载地址
配置及新建项目步骤

SpringBoot 配置文件

配置文件的路径及优先级

配置文件的路径
SpringBoot 使用了一个全局的配置文application.properties,该配置文件可以放置在以下几个位置:

  • 根目录下
  • 项目根目录中 config 目录下
  • 项目的 resources 目录下
  • 项目 resources 目录中config 目录下

配置文件的优先级
经过测试,SpringBoot 项目中配置文件的读取顺序为:

  1. config/application.properties(项目根目录中 config 目录下)
  2. application.properties(项目根目录下)
  3. resources/config/application.properties(项目 resources 目录中 config 目录下)
  4. 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 优缺点

  1. 可以从配置文件中批量注入属性;
  2. 支持获取复杂的数据类型;
  3. 对属性名匹配的要求较低,比如 user-name,user_name,userName,USER_NAME 都可以取值;
  4. 支持 JAVA 的 JSR303 数据校验;
  5. 缺点是不支持强大的 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 的配置文件如下:

  1. Spring Boot 支持两种格式的配置文件,其中 YAML 的数据结构比 properties 更清晰。
  2. YAML 是专门用来写配置文件的语言,非常简洁和强大。
  3. YAML 对空格的要求很严格,且不能用 Tab 键代替。
  4. YAML 通过空格缩进的程度确定层级,冒号后面有空格,短横线后面有空格。
  5. @ConfigurationProperties 注解适合批量注入配置文件中的属性,@Value 注解适合获取配置文件中的某一项。
  6. @ConfigurationProperties 注解支持数据校验和获取复杂的数据,@Value 注解支持 SpEL 表达式。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值