SpringBoot读取配置的6种方式
1.@Value
(推荐使用)
- 通过
@Value
注解绑定配置文件的某一个key,就可以直接读取配置,并给变量赋值。 yaml
文件:
value:
name: 小陈Coding
JavaBean
@SpringBootTest
public class ValuesTest {
@Value("${value.name}")
private String name;
@Test
void test1(){
System.out.println("@Value:" + name);
}
}
- 注意:
Java
类必须是Java Bean
且属性不能被static
和final
修饰,不然@Value
会失效,yaml
文件的配置必须存在,不存在会报错,为了增加容错,可以给@Value
添加默认值
@SpringBootTest
public class ValuesTest {
@Value("${value.name}:小陈Coding")
private String name;
@Test
void test1() {
System.out.println("@Value:" + name);
}
}
- 如果yaml配置存在且默认值存在则会追加
2.@ConfigurationProperties
(推荐使用)
- 只需指定某个key的前缀,前缀下的key将自动绑定到类当中的
同名
的属性成员变量中。(适用批量绑定,比@Value
更加高效) yaml
文件
value:
id: 1
name: 小陈Coding
JavaBean
类
@Component
@Data
@ConfigurationProperties(prefix = "value")
public class ValueTest1 {
private String id;
private String name;
}
- 注意:有时会报
未通过 @EnableConfigurationProperties 注册、标记为Spring 组件或通过@ConfigurationPropertiesScan 扫描
只需在JavaBean
上添加@EnableConfigurationProperties
注解即可 - 测试结果
3.Environment
- 无需自定义
JavaBean
配置,直接注入Environment
或者实现EnvironmentAware
接口即可 Test
类1
@SpringBootTest
public class ValuesTest {
@Autowired
private Environment env;
@Test
void test1() {
System.out.println("Environment:" + env.getProperty("value.id"));
System.out.println("Environment:" + env.getProperty("value.name"));
}
}
Test
类2
@SpringBootTest
public class ValuesTest implements EnvironmentAware {
private Environment env;
@Override
public void setEnvironment(Environment environment) {
this.env=environment;
}
@Test
void test1() {
System.out.println("Environment:" + env.getProperty("value.id"));
System.out.println("Environment:" + env.getProperty("value.name"));
}
}
- 测试结果
以上三个方法都是获取Spring默认的全局配置文件,接下来介绍三种获取自定义配置文件的方法
4.@PropertySources
通过@PropertySources
指定配置类,通过@PropertySource
指定配置文件的类路径,通过@Value
绑定属性变量的值
properties
配置文件
value.id=1
value.name=小陈Coding
JavaBean
类
@Configuration
@Data
@PropertySources({
@PropertySource(value = "classpath:xiaoChenCoding.properties",encoding = "utf-8")
})
public class ValueTest1 {
@Value("${value.id}")
private String id;
@Value("${value.name}")
private String name;
}
- 测试结果
注意:此方法只能读取
properties
文件
那么怎么读取yaml文件呢,第五个方法来了
5.PropertySourcesPlaceholderConfigurer
- 通过注册
PropertySourcesPlaceholderConfigurer
Bean配合@Value
获取自定义yaml文件 PropertySourcesPlaceholderConfigurer
Bean
/**
* 自定义yaml配置类
*/
@Configuration
public class MyYamlConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer myYamlConfig(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("xiaoChenCoding.yaml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
yaml
文件
value:
id: 1
name: 小陈Coding
JavaBean
类
@Component
@Data
public class ValueTest1 {
@Value("${value.id}")
private String id;
@Value("${value.name}")
private String name;
}
- 测试结果
6.原生输入流
- 通过输入流读取配置文件
- 注意:只能读取properties文件
Test
类
@SpringBootTest
public class ValuesTest{
@Test
void test1() {
Properties properties = new Properties();
try{
InputStreamReader inputStreamReader = new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("xiaoChenCoding.properties")
);
properties.load(inputStreamReader);
}catch (Exception e){
System.out.println(e);
}
System.out.println("输入流:" + properties.getProperty("value.id"));
System.out.println("输入流:" + properties.getProperty("value.name"));
}
}
- 测试结果