springboot读取配置文件中的值

前言

在项目开发过程中我们偶尔会遇到需要在配置文件中定义属性和值的情况,下面是一些从配置文件中获取值的方式。
1. 属性定义在springboot默认的配置文件中(application.properties或application.yml)

先在默认配置文件中定义属性

test:
  userName: ceshi
  pass_word: aabb
  nickName: 简称
1.1 @Value方式获取
/** springboot测试类
 *
 * 注意:
 * 1.@Value 是 org.springframework.beans.factory.annotation.Value 包下的
 * 2.test.userName 的层级
 * 3.使用 ${}
 */
@SpringBootTest
public class Test2 {
    @Value("${test.userName}")
    private String userName;
    @Value("${test.pass_word}")
    private String password;
    @Value("${test.nickName}")
    private String nickName;

    @Test
    void test2 () {
        System.out.println("======userName=======" + userName);
        System.out.println("======password=======" + password);
        System.out.println("======nickName=======" + nickName);

    }
}
/* 控制台打印
2024-08-14 16:59:35.070  INFO 5928 --- [           main] com.jpa.Test2                            : Started Test2 in 7.476 seconds (JVM running for 8.944)
======userName=======ceshi
======password=======aabb
======nickName=======简称
*/
1.1 @ConfigurationProperties方式获取
@Data 
@Component
@ConfigurationProperties(prefix = "test") // 属性所在的层级,不包含具体属性字段
public class ApplicationProperties {

    private String userName;
    
    //springboot 会自动给字段的下划线转驼峰
    private String passWord;
    private String nickName;
}


/**
*	springboot测试类
*/
@SpringBootTest
public class Test2 {

    @Resource
    private ApplicationProperties applicationProperties;

    @Test
    public void test() {
        System.out.println("======applicationProperties=======");
        System.out.println(applicationProperties.getUserName());
        System.out.println(applicationProperties.getPassWord());
        System.out.println(applicationProperties.getNickName());
    }
}

/*控制台打印
2024-08-14 17:20:18.220  INFO 7916 --- [           main] com.jpa.Test2                            : Started Test2 in 6.523 seconds (JVM running for 7.973)
======applicationProperties=======
ceshi
aabb
简称
*/

由于springboot默认的配置文件使用的编码格式是UTF-8,所以即使在配置文件中使用了中文,控制台也是可以正常展示的,不会出现乱码的情况

2. 属性定义在自定义的配置文件中

自定义配置文件:在resources文件夹下创建config文件夹,在config文件夹下创建email.yml配置文件.

email:
  userName: ceshi1
  pass_word: aabb1
  nickName: 简称1
2.1 创建自定义配置文件对应的自定义实体类

在实体类中使用@PropertySource + @Value 获取属性值

@Data
@Configuration
/**
 * @PropertySource 是 org.springframework.context.annotation.PropertySource 包下
 *      value:是自定义配置文件的相对路径
 * @Value 是 org.springframework.beans.factory.annotation.Value 包下
 */
@PropertySource(value = "classpath:config/email.yml")
public class EmailProperties {

    @Value("${userName}")
    private String userName;
    @Value("${pass_word}")
    private String passWord;
    @Value("${nickName}")
    private String nickName;
}



/**
*	springboot测试类
*/
@SpringBootTest
public class Test2 {

    @Resource
    EmailProperties emailProperties;

    @Test
    void test3 () {
        System.out.println("======emailProperties=======");
        System.out.println(emailProperties.getUserName());
        System.out.println(emailProperties.getPassWord());
        System.out.println(emailProperties.getNickName());
    }
}

/*控制台打印
2024-08-14 17:40:36.282  INFO 24224 --- [           main] com.jpa.Test2                            : Started Test2 in 6.011 seconds (JVM running for 7.445)
======emailProperties=======
haidsun
aabb1
简称1
*/

可以看到上面的打印日志中中文是乱码的。
这是因为SpringBoot在加载自定义配置文件时,默认编码使用的编码方式是:ISO_8859_1,由于项目是使用的UTF-8方式,所以会出现中文乱码的情况。
解决方式:配置@PropertySource注解的编码属性。encoding = "UTF-8"

@PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8")
public class EmailProperties {

    @Value("${userName}")
    private String userName;
    @Value("${pass_word}")
    private String passWord;
    @Value("${nickName}")
    private String nickName;
}

/*控制台打印
2024-08-14 17:48:06.928  INFO 2644 --- [           main] com.jpa.Test2                            : Started Test2 in 7.644 seconds (JVM running for 9.097)
======emailProperties=======
haidsun
aabb1
简称1
*/
2.2 一个自定义配置实体对应多个配置文件

config文件夹下再创建配置文件config.yml
使用@PropertySources 注解

@Data
@Configuration
@PropertySources({
        @PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8"),
        @PropertySource(value = "classpath:config/config.yml", encoding = "UTF-8")
})
@PropertySource(value = "classpath:config/email.yml", encoding = "UTF-8")
public class EmailProperties {

    @Value("${userName}")
    private String userName;
    @Value("${pass_word}")
    private String passWord;
    @Value("${nickName}")
    private String nickName;

    @Value("${host}")
    private String host;
    @Value("${port}")
    private String port;
    @Value("${auth}")
    private String auth;
}
2.3 注意事项

需要注意:
1.我在使用@PropertySource + @Value 获取属性值时,在使用@Value 时没有配置属性的层级,而是直接配置属性名。
如果配置属性的层级就会报错!!
所以我们在自定义配置文件时,不要配置属性名相同的属性,即使层级不同也不行,如果属性名相同,那么属性会取最后一个属性值。
2.如果使用@PropertySources注解,那么在多个配置文件中属性名也不可以相同。
如果相同,那么相同的属性的值会取最后一个配置文件的最后一个同名属性的值。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值