Springboot读取yaml配置文件的三种方式(以及static注入失效的解决方式和原理)

前言

初衷:
1.最近在搭建springboot项目的时候,使用static修饰属性遇到读取配置文件失败。
2.总结一下对项目配置文件整体或者拆分处理
注意:@PropertySource方式只对properties文件可以进行加载,但对于yml或者yaml不能支持。
首先看一下yaml部分配置:

spring:
  # 数据库配置
  datasource:
    druid:
      driver-class-name: oracle.jdbc.OracleDriver
      url: jdbc:oracle:thin:@xxx.x.x.x:1521/orcl
      username: scott
      password: 12345

正文

1.@value+@Configuration对配置的全局处理
1.1 正确写法

1.新建全局配置类Confignature,用于配置整个yaml的配置信息。(正确写法)
由下面可以看到,有2种写法
(1)直接在属性上面@value注解(代码简洁,但是每次使用需要先new一个Confignature对象,或者@Autowired先注入):driver-class-name
(2)属性上面加static关键字修饰,@value写在对应set方法上面(不需要new,可以其他类直接调用):url,username,password

@Configuration
public class Confignature {

    @Value(value = "${spring.datasource.druid.driver-class-name}")
    public String DATASOURCE_DRUID_DRIVER_CLASS_NAME; //oracle驱动

    public static String DATASOURCE_DRUID_URL; //oracle url

    public static String DATASOURCE_DRUID_USERNAME; // oracle 用户名

    public static String DATASOURCE_DRUID_PASSWORD; // oracle 密码

    @Value("${spring.datasource.druid.url}")
    public void setDatasourceDruidUrl(String datasourceDruidUrl) {
        DATASOURCE_DRUID_URL = datasourceDruidUrl;
    }

    @Value("${spring.datasource.druid.username}")
    public void setDatasourceDruidUsername(String datasourceDruidUsername) {
        DATASOURCE_DRUID_USERNAME = datasourceDruidUsername;
    }

    @Value("${spring.datasource.druid.password}")
    public void setDatasourceDruidPassword(String datasourceDruidPassword) {
        DATASOURCE_DRUID_PASSWORD = datasourceDruidPassword;
    }
}

2.写一个controller测试一下

    @Autowired
    private Confignature confignature;

    @GetMapping("/testSpringBoot")
    @ResponseBody
    public void testSpringBoot() {
    	// driver属性需要先注入confignature配置类
        System.out.println(confignature.DATASOURCE_DRUID_DRIVER_CLASS_NAME);
        // url,usernam,password属性可以直接调用
        System.out.println(Confignature.DATASOURCE_DRUID_URL);
        System.out.println(Confignature.DATASOURCE_DRUID_USERNAME);
        System.out.println(Confignature.DATASOURCE_DRUID_PASSWORD);

    }

如图所示:成功获取值
在这里插入图片描述

1.2 错误写法

错误写法:
(1)@value注解和static同时在属性上面
(2)static修饰属性,但是set方法用了static修饰

@Configuration
public class Confignature {

    // 第一种错误写法
    @Value(value = "${spring.datasource.druid.driver-class-name}")
    public static String DATASOURCE_DRUID_DRIVER_CLASS_NAME; //oracle驱动

    // 第二种错误写法
    public static String DATASOURCE_DRUID_URL; //oracle url

    // 正确写法
    public static String DATASOURCE_DRUID_USERNAME; // oracle 用户名

    // 正确写法
    public static String DATASOURCE_DRUID_PASSWORD; // oracle 密码

    @Value("${spring.datasource.druid.url}")
    public static void setDatasourceDruidUrl(String datasourceDruidUrl) {
        DATASOURCE_DRUID_URL = datasourceDruidUrl;
    }

    @Value("${spring.datasource.druid.username}")
    public void setDatasourceDruidUsername(String datasourceDruidUsername) {
        DATASOURCE_DRUID_USERNAME = datasourceDruidUsername;
    }

    @Value("${spring.datasource.druid.password}")
    public void setDatasourceDruidPassword(String datasourceDruidPassword) {
        DATASOURCE_DRUID_PASSWORD = datasourceDruidPassword;
    }

}

测试一下:
在这里插入图片描述

2.ConfigurationProperties注解对配置进行拆分处理

1.新建一个配置类DatasourceConfig,注意属性名称要跟yaml配置文件一致。这里罗列正确和错误写法(不能用static修饰属性)
正确:driverClassName,url,username
错误:password
这种写法优势:当yaml配置文件配置信息过多,可以多写几个DatasourceConfig针对不同的配置,这样结构更为清晰

@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DatasourceConfig {

    private String driverClassName;

    private String url ;

    private String username;

    // 错误写法
    private static String password;

}

2.新写一个controller,这种方式就必须要@Autowired注入DatasourceConfig 配置类

    @Autowired
    private DatasourceConfig datasourceConfig;

    @GetMapping("/testSpringBoot1")
    @ResponseBody
    public void testSpringBoot1() {
        System.out.println(datasourceConfig.getDriverClassName());
        System.out.println(datasourceConfig.getUrl());
        System.out.println(datasourceConfig.getUsername());

    }

测试一下:
由图可知,取得了3个值,password未能获取,原因在于属性用了static修饰
在这里插入图片描述

3.Environment读取yaml配置文件

1.新写一个controller,注入Environment 类

    @Autowired
    private Environment env;

    @GetMapping("/testSpringBoot2")
    @ResponseBody
    public void testSpringBoot2() {
        System.out.println(env.getProperty("spring.datasource.druid.driver-class-name"));
        System.out.println(env.getProperty("spring.datasource.druid.url"));
        System.out.println(env.getProperty("spring.datasource.druid.username"));
        System.out.println(env.getProperty("spring.datasource.druid.password"));

    }

测试一下:
在这里插入图片描述

pom相关依赖
    <!--配置类相关-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    <!--druid相关-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.20</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>

    <!--oracle相关-->
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.3</version>
    </dependency>

    <!--lomback-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.0</version>
      <scope>provided</scope>
    </dependency>

源码解读为什么@value不能注入static

@Value注解不能注入static修饰的属性

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值