从配置文件中获取属性应该是SpringBoot
开发中最为常用的功能之一,简单回顾一下这六种的使用方式:
说明 | |
---|---|
Environment 对象 |
Environment 是springboot 核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等,使用Environment 方式来获取配置属性值非常简单,只要注入Environment 类调用其方法 getProperty (属性key ) 即可。 |
@Value |
@Value 注解是Spring 框架提供的用于注入配置属性值的注解,它可用于类的成员变量、方法参数和构造函数参数上, 在应用程序启动时,使用@Value 注解的Bean 会被实例化。所有使用了@Value 注解的Bean 会被加入到PropertySourcesPlaceholderConfigurer 的后置处理器集合中。当后置处理器开始执行时,它会读取Bean 中所有@Value 注解所标注的值,并通过反射将解析后的属性值赋值给标有@Value 注解的成员变量、方法参数和构造函数参数。重要!!! ⚠️注意 ①在使用@Value 注解时需要确保注入的属性值已经加载到Spring 容器中,否则会导致注入失败; ②建议引用变量的时候给定一个默认值,避免启动报“缺失配置”的错误; ③通过依赖注入的方式获取对象中属性值,切记不要使用new的方式来创建对象获取其属性。 |
@ConfigurationProperties |
SpringBoot 提供的一种更加便捷来处理配置文件中的属性值的方式,可以通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean 对象上。 |
@PropertySources |
@PropertySources 注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到Environment 中,这样可以通过@Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值了。默认只限读取properties 文件内容,想加载yaml 文件内容,可以自定义factory 适配器,指定factory 具体的使用。 |
YamlPropertiesFactoryBean 对象 |
只限读取yaml 文件,通过@Value 注解或Environment.getProperty() 方法来配合着获取其中定义的属性值。 |
JAVA 原生 |
通过java.util.Properties 去加载配置文件中的属性。 |
Environment
注入Environment
类调用其方法getProperty
(属性key
)即可。
@Slf4j
@SpringBootTest
public class EnvironmentTest {
@Resource
private Environment env;
@Test
public void var1Test() {
String var1 = env.getProperty("env.var1");
log.info("Environment获取的配置内容:{}", var1);
}
}
@Value
注解只要在变量上加注解@Value("${env.var1}")
就可以了,@Value
注解会自动将配置文件中的env.var1
属性值注入到var1
字段中。
@Slf4j
@SpringBootTest
public class EnvVariablesTest {
@Value("${env.var1}")
private String var1;
@Test
public void var1Test(){
log.info("配置文件属性: {}",var1);
}
}
@ConfigurationProperties
注解在application.yml
配置文件中添加配置项:
env:
var1: 变量值1
var2: 变量值2
创建一个MyConf
类用于承载所有前缀为env
的配置属性。
@Data
@Configuration
@ConfigurationProperties(prefix = "env")
public class MyConf {
private String var1;
private String var2;
}
在需要使用var1
、var2
属性值的地方,将MyConf
对象注入到依赖对象中即可。
@Slf4j
@SpringBootTest
public class ConfTest {
@Resource
private MyConf myConf;
@Test
public void myConfTest() {
log.info("@ConfigurationProperties注解获取的配置内容:{}", JSON.toJSONString(myConf));
}
}
@PropertySources
注解在src/main/resources/
目录下创建自定义配置文件important.properties
,增加两个属性。
env.var1=变量值1
env.var2=变量值2
在需要使用自定义配置文件的类上添加@PropertySources
注解,注解value
属性中指定自定义配置文件的路径,可以指定多个路径,用逗号隔开。
@Data
@Configuration
@PropertySources({
@PropertySource(value = "classpath:important.properties", encoding = "utf-8"),
@PropertySource(value = "classpath:important.properties",encoding = "utf-8")
})
public class PropertySourcesConf {
@Value("${env.var1}")
private String var1;
@Value("${env.var2}")
private String var2;
}
YamlPropertiesFactoryBean
加载YAML
文件@Configuration
public class MyYamlConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("test.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
可以通过@Value
注解或Environment.getProperty()
方法来获取其中定义的属性值。
@Slf4j
@SpringBootTest
public class YamlTest {
@Value("${env.var3}")
private String var3;
@Test
public void myYamlTest() {
log.info("Yaml获取配置内容:{}", var3);
}
}
JAVA
原生读取@Slf4j
@SpringBootTest
public class CustomTest {
@Test
public void customTest() {
Properties props = new Properties();
try {
InputStreamReader inputStreamReader = new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("test.properties"),
StandardCharsets.UTF_8);
props.load(inputStreamReader);
} catch (IOException e1) {
System.out.println(e1);
}
log.info("Properties Name:" + props.getProperty("env.appName"));
}
}