这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
项目中读取配置文件中内容时最常用的方法就是使用@Value注解;对于非官方指定的配置类文件,则需要借助@PropertySource注解实现注入;而在配置类中读取一组配置属性时还可以通过@ConfigurationProperties注解指定统一的前缀内容。
1. 使用@Value注解
@Value注解使用时会优先读取默认配置文件application.properties中定义的属性。
- 使用方式为:
@value("${server.port}") - 使用时将注解标注在成员变量上,表示将对应属性值加载到该变量中
- 使用@Value注解时需要注意,如果不满足以下条件时,注入属性的值为null
- 使用了static或final修饰了字段变量,此时在容器注入对象时不会对静态变量赋值
- 类上没有使用@Component或其他将类加入容器的注解,类不在容器中无法注入属性
- 使用new创建了类的示例而不是使用@Autowired,此时不是从容器中获取,无法注入属性
public class Config{
@Value("${server.port}")
private String port;
}
2. @PropertySource
@PropertySource可以用来读取自定义配置文件中定义的属性。
- 该注解可以标注在类或者接口上,设置当前类的属性读取对应的配置文件内容
- 使用方式:
@PropertySource(value={"classpath:/other.properties"}) - 此时在类中属性上使用注解@Value("name"),读取的就是指定配置文件中的值
- 注意,如果默认配置文件中存在同名属性,则默认配置文件的优先级更高
@PropertySource使用小细节
- @PropertySource加载配置文件是将指定文件同时加入到容器中,而不会覆盖,可以同名
- 通过注解
@PropertySource导入进来的属性源的优先级是最低的 - 加载配置文件时,源路径使用
classpath,绝对路径使用file:/src/...
@PropertySource和Environment配合使用
- 使用@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;
}