目录
- 自定义配置文件
- 加载配置文件
- 三种读取属性的方式
- 1.@Value
- 2.@ConfigurationProperties
- 3.Environment
- 读取.yml或者.yaml结尾的配置文件
在 SpringBoot 项目中,我们可能需要自定义配置文件,来实现更加灵活和个性化的配置。因为自定义的配置文件并不会被应用自动加载,所以需要我们手动指定加载。
具体来说就是使用 @PropertySource
注解指定 自定义配置文件的路径,这样就可以将 自定义配置文件 加载到 Spring 的上下文中;然后就可以通过 @Value
或 @ConfigurationProperties
或 Environment
三种不同的方式读取配置文件中的属性值了。
自定义配置文件
在 resources 目录下创建自定义配置文件test.properties
person.my-name=mary
person.my-hobby=running
加载配置文件
通常是在配置类上加 @PropertySource 注解,指定自定义配置文件的路径。
@Configuration
@PropertySource(value = {"classpath:test.properties"})
public class MyConfig {
}
三种读取属性的方式
1.@Value
将 @Value
加在属性上,指定要读取的配置项的 key 即可。
注意:类上要加 @Configuration
或 @Component
等注解,将对象交给 Spring 容器管理,获取属性时使用的对象也是要从 Spring 容器中注入的,而不是我们手动 new 出来的。
@Configuration // 一定要加
@PropertySource(value = {"classpath:test.properties"})
public class MyConfig {
@Value("${person.my-hobby}")
private String myHobby;
@Value("${person.my-name}")
private String myName;
}
2.@ConfigurationProperties
@ConfigurationProperties 可以指定一个前缀,将配置文件中该前缀的配置项 对应地读取到 对象的多个属性中。
属性与配置项根据名称进行匹配,配置项名称可以使用 短横线-
或 下划线_
分隔,属性使用驼峰命名。
注意:
1)要引入 spring-boot-configuration-processor
依赖。
2)类上要加 @Configuration
或 @Component
等注解,将对象交给 Spring 容器管理。
3)类中要有属性对应的 setter 方法。
配置文件:
#短横线
person.my-name=mary
person.my-hobby=running
#或者 下划线
#person.my_name=mary
#person.my_hobby=running
@Configuration // 一定要加
@PropertySource(value = {"classpath:test.properties"})
@ConfigurationProperties(prefix = "person")
public class MyConfig {
private String myHobby;
private String myName;
// 必须要有属性对应的 setter 方法
public void setMyHobby(String myHobby) {
this.myHobby = myHobby;
}
// 必须要有属性对应的 setter 方法
public void setMyName(String myName) {
this.myName = myName;
}
}
3.Environment
只要注入 Environment 类的 bean 对象,调用其方法 getProperty(属性key) 即可获得配置文件中的属性。
@Configuration
@PropertySource(value = {"classpath:test.properties"})
public class MyConfig {
}
@Resource
Environment environment;
@Test
public void config_test() {
System.out.println(environment.getProperty("person.my-name"));
System.out.println(environment.getProperty("person.my-hobby"));
}
读取.yml或者.yaml结尾的配置文件
@PropertySource 默认只支持加载 .properties
的配置文件,因为注解内部只内置了PropertySourceFactory 适配器。
如果想要加载一个.yaml
或 .yml
配置文件,则需要自行实现 yaml 的适配器 YamlPropertySourceFactory,并在加载配置文件时显示的指定使用该适配器。
yaml 的适配器 YamlPropertySourceFactory
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.IOException;
import java.util.Properties;
public class YAMLPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
//1. 创建一个YAML文件的解析工厂。
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
//2. 设置资源。
factory.setResources(encodedResource.getResource());
//3. 获取解析后的Properties对象
Properties properties = factory.getObject();
//4. 返回:此时不能像默认工厂那样返回ResourcePropertySource对象 ,要返回他的父类PropertiesPropertySource对象
return name != null ? new PropertiesPropertySource(name, properties) :
new PropertiesPropertySource(encodedResource.getResource().getFilename(),properties);
}
}
显示指定适配器
@Configuration
@PropertySource(value = {"classpath:test.yml"}, factory = YAMLPropertySourceFactory.class)
public class MyConfig {
}
如果有帮助的话,可以点个赞支持一下嘛
🙏