SpringBoot支持使用Properties和YAML两种配置方式。两者功能类似,都能完成SpringBoot的配置,但是Properties的优先级要高于YAML(YAML语言的文件以“.yml”为后缀)。
YAML文件的好处是——它采用的是树形结构,一目了然。如下:
server:
port: 8080
servlet:
session:
timeout: 30
tomcat:
uri-encoding: UTF-8
userinfo:
userId: 1
userName: pan_junbiao的博客
blogUrl: https://blog.csdn.net/pan_junbiao
hobbys: [篮球,足球,羽毛球,乒乓球,游泳]
remark: 您好,欢迎访问 pan_junbiao的博客
但是,使用YAML配置方式时要注意以下几点。
(1)原来以“.”分隔的key会变成树状结构。例如,“server.port=8080”会变成:
server:
port: 8080
(2)在key后的冒号后一定要跟一个空格,如“port: 8080”(注意:冒号后面有个空格)。
(3)如果把原有的 application.properties 配置文件删除了,则建议执行一下 “maven -X clean install” 命令。
(4)YAML格式不支持使用注解@PropertySource注解导入配置。
(5)YAML配置是大小写敏感的。
1、使用application.yml文件
【示例】使用application.yml文件配置SpringBoot项目。主要对SpringBoot项目的端口号、超时时间、参数值等进行配置。
(1)编写application.yml文件
新建一个SpringBoot项目,在resources资源目录下创建application.yml文件,在文件中添加如下代码:
server:
port: 8081
servlet:
session:
timeout: 30
tomcat:
uri-encoding: UTF-8
name: pan_junbiao的博客
age: 32
blog: https://blog.csdn.net/pan_junbiao
remark: 您好,欢迎访问 pan_junbiao的博客
userinfo:
userId: 1
userName: pan_junbiao的博客
blogUrl: https://blog.csdn.net/pan_junbiao
hobbys: [篮球,足球,羽毛球,乒乓球,游泳]
remark: 您好,欢迎访问 pan_junbiao的博客
(2)编写测试
编写测试,用于获取配置文件中的配置项的值。
package com.pjb.helloworld;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 获取配置项的值
* @author pan_junbiao
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class PropertTest
{
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@Value("${blog}")
private String blog;
@Value("${remark}")
private String remark;
//该注解表示一个测试方法
@Test
public void getInfo()
{
System.out.println("获取application.yml配置文件中的信息:");
System.out.println("name值:" + name);
System.out.println("age值:" + age);
System.out.println("blog值:" + blog);
System.out.println("remark值:" + remark);
}
}
代码说明:
@SpringBootTest注解:用于测试的注解,可以指定入口类或测试环境等。
@RunWith(SpringRunner.class)注解:在Spring测试环境中进行测试。
@Test注解:表示一个测试方法。
执行结果:
(3)创建UserInfoA类
定义一个UserInfoA实体类,以装载配置文件的信息。并用于处理配置文件中以 “userinfo” 为前缀的配置项的值。
package com.pjb.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 用户信息类
* @author pan_junbiao
**/
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfoA
{
private int userId; //用户编号
private String userName; //用户名称
private String blogUrl; //博客地址
private String[] hobbys; //兴趣爱好
private String remark; //备注信息
//省略getter与setter方法...
}
代码说明:
@Component注解:声明此类是Spring管理类。
@ConfigurationProperties注解:把同类配置信息自动封装成一个实体类。其属性 prefix 代表配置文件中配置项的前缀,如在配置文件中定义的“userinfo”。
还可以把@ConfigurationProperties注解直接定义在@Bean注解里,这时Bean实体类就不需要@Component注解和@ConfigurationProperties注解了,在调用时依然一样调用,如下代码:
@Bean
@ConfigurationProperties(prefix = "userinfo")
public UserInfoA userInfoA()
{
return new UserInfoA();
}
(4)编写测试,获取配置项“userinfo”的值
编写测试,用于获取配置文件中的“userinfo”配置项的值。
package com.pjb.helloworld;
import com.pjb.entity.UserInfoA;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
/**
* 用户信息测试类
* @author pan_junbiao
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserInfoATest
{
@Autowired
private UserInfoA userInfoA;
@Test
public void getUserInfo()
{
System.out.println("获取application.yml配置文件中的信息:");
System.out.println("用户编号:" + userInfoA.getUserId());
System.out.println("用户名称:" + userInfoA.getUserName());
System.out.println("博客地址:" + userInfoA.getBlogUrl());
System.out.println("兴趣爱好:共" + userInfoA.getHobbys().length + "个," + Arrays.toString(userInfoA.getHobbys()));
System.out.println("备注信息:" + userInfoA.getRemark());
}
}
执行结果:
2、使用application.properties文件
【示例】使用application.properties文件配置SpringBoot项目,主要对SpringBoot项目的用户信息进行配置。
(1)编写application.properties文件
创建application.properties文件,并添加以下配置项及其值。
com.example.userId=1
com.example.userName=pan_junbiao的博客
com.example.blogUrl=https://blog.csdn.net/pan_junbiao
com.example.hobbys[0]=篮球
com.example.hobbys[1]=足球
com.example.hobbys[2]=羽毛球
com.example.hobbys[3]=乒乓球
com.example.hobbys[4]=游泳
com.example.remark=您好,欢迎访问 pan_junbiao的博客
(2)编写类文件处理配置项
定义一个UserInfoB实体类,用于获取配置文件中配置项的值。
package com.pjb.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 用户信息类
* @author pan_junbiao
**/
@Component
@ConfigurationProperties(prefix = "com.example")
public class UserInfoB
{
private int userId; //用户编号
private String userName; //用户名称
private String blogUrl; //博客地址
private String[] hobbys; //兴趣爱好
private String remark; //备注信息
//省略getter与setter方法...
}
(3)编写测试,获取配置项的值
编写测试代码,获取application.properties配置文件中的配置项的值。
package com.pjb.helloworld;
import com.pjb.entity.UserInfoB;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
/**
* 用户信息测试类
* @author pan_junbiao
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserInfoBTest
{
@Autowired
private UserInfoB userInfoB;
@Test
public void getUserInfo()
{
System.out.println("获取application.properties配置文件中的信息:");
System.out.println("用户编号:" + userInfoB.getUserId());
System.out.println("用户名称:" + userInfoB.getUserName());
System.out.println("博客地址:" + userInfoB.getBlogUrl());
System.out.println("兴趣爱好:共" + userInfoB.getHobbys().length + "个," + Arrays.toString(userInfoB.getHobbys()));
System.out.println("备注信息:" + userInfoB.getRemark());
}
}
执行结果:
3、处理中文乱码问题
这里一定要注意编码。如果使用的是中文,则有可能出现乱码,请单击IDEA菜单栏中的 “File → Settings → Editor → File Encodings” 命令,设置如下图:
4、使用application.yml和application.properties配置多环境
在实际项目的开发过程中,经常需要配置多个环境(如开发环境和生成环境),以便不同的环境使用不同的配置参数。
4.1 使用application.yml配置多环境
【示例】通过application.yml文件来实现多环境的配置。
(1)创建3个YML配置文件
在resources资源目录下新建3个YML配置文件,它们分别代表开发环境(application-dev.yml)、生成环境(application-prod.yml)、主配置文件(application.yml)。如下图:
开发环境(application-dev.yml)输入以下配置信息:
server:
port: 8081
servlet:
session:
timeout: 30
tomcat:
uri-encoding: UTF-8
myenvironment:
name: 开发环境
userinfo:
userId: 1
userName: pan_junbiao的博客
blogUrl: https://blog.csdn.net/pan_junbiao
hobbys: [篮球,足球,羽毛球,乒乓球,游泳]
remark: 您好,欢迎访问 pan_junbiao的博客
生成环境(application-prod.yml)输入以下配置信息:
server:
port: 8081
servlet:
session:
timeout: 30
tomcat:
uri-encoding: UTF-8
myenvironment:
name: 生成环境
userinfo:
userId: 8
userName: pan_junbiao的博客
blogUrl: https://blog.csdn.net/pan_junbiao
hobbys: [篮球,足球,羽毛球,乒乓球,游泳]
remark: 您好,欢迎访问 pan_junbiao的博客
主配置文件(application.yml)输入以下配置信息:
spring:
profiles:
active: dev
在application.yml中,指定当前活动的配置文件为application-dev.yml。
提示:spring.profiles.active 命令表示当前设置生效的配置文件是 dev(开发环境)。如果要发布,则直接将 active 的值该为“prod”。
(2)编写测试
编写测试代码,获取不同环境下的配置信息。
package com.pjb.helloworld;
import com.pjb.entity.UserInfoA;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
/**
* 多环境配置测试
* @author pan_junbiao
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class MultiYmlTest
{
@Autowired
private UserInfoA userInfoA;
//获取配置信息,当前环境名称
@Value("${myenvironment.name}")
private String environment;
@Test
public void getUserInfo()
{
System.out.println("================================================");
System.out.println("当前环境:" + environment);
System.out.println("================================================");
System.out.println("获取【"+environment+"】下的用户信息");
System.out.println("用户编号:" + userInfoA.getUserId());
System.out.println("用户名称:" + userInfoA.getUserName());
System.out.println("博客地址:" + userInfoA.getBlogUrl());
System.out.println("兴趣爱好:共" + userInfoA.getHobbys().length + "个," + Arrays.toString(userInfoA.getHobbys()));
System.out.println("备注信息:" + userInfoA.getRemark());
System.out.println("================================================");
}
}
执行结果:
(3)变更应用程序环境
如果要变更为生成环境,则将主配置文件(application.yml)中的 “active: dev” 改为 “active: prod”,然后再次运行测试代码。
执行结果:
4.2 使用application.properties配置多环境
【示例】通过application.properties文件来实现多环境的配置。
(1)和YAML配置方式一样,创建application-dev.properties、application-prod.properties、application.properties 三个配置文件,它们分别代表开发环境、生成环境和主配置文件。
(2)在主配置文件 application.properties 中配置当前活动选项,例如,要使用dev开发环境,则配置信息如下:
spring.profiles.active=dev
当然,都可以在运行JAR包时指定配置文件。如果要在启动时指定使用prod生成环境,则可以输入以下命令:
java -jar name.jar --spring.profiles.active=prod