SpingBoot读取全局以及外部配置的6种方式
前面三种是读取全局配置文件,后边三个是读取外部配置文件。
全局配置文件:application.yml
自定义外部配置文件:wang.properties
自定义外部配置文件:wang.yml
1.@Value注解方式(最简单的方式、逐个绑定)
使用方法:使用@Value注解加在成员变量属性上,指定读取的key和value。
配置文件:全局配置文件
//配置文件:application.yml
wang:
name: 值
id: 值
java示例:
@SpringBootTest
@Slf4j
class ValueTests {
@value("${wang.name")//1.读取配置,不存在会报错
//@value("${wang.name:defaultVlue")//2.给一个默认值,增加容错率
//@value("${wang.name:")//3.只加冒号会给一个空值,增加容错率
private String name;
@Test
public void var1Test() {
log.info("value配置获取{}",name) ;
}
}
注意事项:
注意事项: 1.所在的这个类,要是一个Bean,否则不生效。 2.读取的这个配置要在配置文件中要有,否则启动会报错。 防止出错,增加容错率,加一个默认值,或者只加冒号会赋一个空值。 3.如果是statis、final也无法生效。 @value("${wang.name")//1.读取配置,不存在会报错 private statis String name; private final String name; 4.@Value只能一个一个赋值。如果成员属性很多,就要写很多个@Value进行逐一赋值。
2.@ConfigurationProperties 配置文件绑定方式(批量绑定)
使用方法:通过这个注解,绑定配置文件中某一个key的前缀,这个wang下边的子集就会自动绑定到这个类中的属性成员变量中。
配置文件:全局配置文件
//配置文件:application.yml
wang:
name: 值
id: 值
java示例:
@Slf4j
@Data
@ConfigurationProperties(prefix = "wang")//通过这个注解,绑定配置文件中某一个key的前缀,这个wang下边的子集就会自动绑定到这个类中的属性成员变量中。
@SpringBootTest
public class ConfigurationPropertiesTest {
private string name;
private string id;
@Test
public void var1Test() {
log.info("PropertySource 配置获取{}",name);
}
}
3. 使用Environment(代码中动态获取配置)
注释:
Environment 是springboot核心的环境配置接口,它提供了简单的方法来访问应用程度属性, 包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等。
使用方法:参考java示例1、java示例2
配置文件:全局配置文件
//配置文件:application.yml
wang:
name: 值
id: 值
beanClass: //动态控制一个Bean是否生效
isEnabed: //动态控制一个Bean是否生效
java示例1:
实现EnvironmentAware接口,重写setEnvironment进行赋值。(耦合性低,一般使用这个不使用示例2)
@SpringBootTest
@Slf4j
class EnvironmentTests implements EnvironmentAware {
private Environment env;
@Test
public void var1Test(){
String var1 = env.getProperty ("wang.name");
log.info( "Environment配置获取{}",var1);
}
@Override
public void setEnvironment(Environment environment){
this.env=environment;
}
}
java示例2:
Environment 也是一个Bean可以通过自动装配的方式引用进来,增加@Resource注解自动装配。
通过env.getProperty()获取value。
@SpringBootTest
@Slf4j
class EnvironmentTests {
@Resource
private Environment env;
@Test
public void var1Test(){
String var1 = env.getProperty ("wang.name");
log.info( "Environment配置获取{}",var1);
}
}
4.@PropertySources()注解(指定外部配置文件的类路径)
使用方法:在类上使用@PropertySources()注解指定外部配置文件的类路径。
配置文件:wang.properties
wangzi.name=王子
java示例:
@Data
@configuration
@PropertySources({
@PropertySource(value = "classpath:wang.properties",encoding = "utf-8")
})
public class PropertySourcesConf {
@valu( "${wangzi.name}")
private string name ;
}
注意事项:
该方法只能获取.properties后缀的文件配置。 如果需要读取yml文件的话,看方法五。
5.定义一个配置类PropertySourcesPlaceholderConfigurer(读取yml后缀外部配置文件)
使用方法: 定义一个配置类,配置一个PropertySourcesPlaceholderConfigurer的Bean,实例化一个YamlPropertiesFactoryBean把yaml对象,设置到PropertySourcesPlaceholderConfigurer中。
配置文件:wang.yml
file:
type: yml外部文件
java示例:
/**
* @Author: WANGZI
* @Date: 2023/9/25 0:41:43
*/
@Configuration
public class MyYamlConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer yamlConfigurer(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("wang.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
通过配置类之后,就可以使用@Value方式去获取一个外部的yaml文件了
/**
* @Author: WANGZI
* @Date: 2023/9/25 0:43:41
*/
@SpringBootTest
@Slf4j
class YamlTests {
@Value("${file.type}")
private string type ;
@Test
public void varlTest() {
log.info("外部yaml配置获取{}",type);
}
}
6.java原生的方式:输入流InputStreamReader(外部配置文件)
使用方法:直接是用输入流的方式,将流读取到Properties对象中,通过properties.getProperty("zhouyu. name")获取到一个外部的properties文件。
配置文件:wang.properties
wangzi.name=王子
java示例:
@Slf4j
@SpringBootTest
public class CustomTest {
@Test
public void customTest() {
Properties properties = new Properties();
InputStreamReader inputStreamReader = new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("wang.properties"),
StandardCharsets.UTF_8);
try {
properties.load(inputStreamReader);
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println("Properties Name: " + properties.getProperty("wangzi. name"));
}
}