SpringBoot使用注解获取配置文件属性值

1,706 阅读2分钟

这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

项目中读取配置文件中内容时最常用的方法就是使用@Value注解;对于非官方指定的配置类文件,则需要借助@PropertySource注解实现注入;而在配置类中读取一组配置属性时还可以通过@ConfigurationProperties注解指定统一的前缀内容。

1. 使用@Value注解

@Value注解使用时会优先读取默认配置文件application.properties中定义的属性。

  • 使用方式为:@value("${server.port}")
  • 使用时将注解标注在成员变量上,表示将对应属性值加载到该变量中
  • 使用@Value注解时需要注意,如果不满足以下条件时,注入属性的值为null
    1. 使用了static或final修饰了字段变量,此时在容器注入对象时不会对静态变量赋值
    2. 类上没有使用@Component或其他将类加入容器的注解,类不在容器中无法注入属性
    3. 使用new创建了类的示例而不是使用@Autowired,此时不是从容器中获取,无法注入属性
public class Config{
    @Value("${server.port}")
    private String port;
}

2. @PropertySource

@PropertySource可以用来读取自定义配置文件中定义的属性。

  • 该注解可以标注在类或者接口上,设置当前类的属性读取对应的配置文件内容
  • 使用方式:@PropertySource(value={"classpath:/other.properties"})
  • 此时在类中属性上使用注解@Value("name"),读取的就是指定配置文件中的值
  • 注意,如果默认配置文件中存在同名属性,则默认配置文件的优先级更高

@PropertySource使用小细节

  1. @PropertySource加载配置文件是将指定文件同时加入到容器中,而不会覆盖,可以同名
  2. 通过注解@PropertySource导入进来的属性源的优先级是最低的
  3. 加载配置文件时,源路径使用classpath,绝对路径使用file:/src/...

@PropertySourceEnvironment配合使用

  • 使用@PropertySource注解将指定配置文件加入容器中
  • 注入Environment对象,通过其env.getProperty("name.short")来或取指定属性的值
 @Configuration
 @PropertySource("classpath:test.properties")
 public class TestConfig {
    @Autowired
    private Environment env;
    
    public void test(){
        String shortName = env.getProperty("name.short");
    }
 }

3. 使用@ConfigurationProperties注解

@ConfigurationProperties注解可以为配置类的属性变量指定配置文件中对应的属性前缀。

  • 使用方式:@ConfigurationProperties(prefix = "user")
  • 此时会使用默认配置文件中以user开头的属性
  • 定义属性变量时,如果类变量与配置文件属性同名,则可以不适用@Value注解
  • 也可以与@PropertySource配合使用,加载非默认配置文件中属性
@ConfigurationProperties(prefix = "user")
public class Config{
    // user.name
    private String name;
}