1.@value+@Configuration对配置的全局处理
1.1 正确写法
1.2 错误写法
2.ConfigurationProperties注解对配置进行拆分处理
3.Environment读取yaml配置文件
pom相关依赖
源码解读为什么@value不能注入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>

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信