SpringBoot使用Properties和YAML配置多环境

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文件

扫描二维码关注公众号,回复: 10977066 查看本文章

新建一个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
发布了377 篇原创文章 · 获赞 278 · 访问量 180万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/105088021