目录

  • 自定义配置文件
  • 加载配置文件
  • 三种读取属性的方式
  • 1.@Value
  • 2.@ConfigurationProperties
  • 3.Environment
  • 读取.yml或者.yaml结尾的配置文件



在 SpringBoot 项目中,我们可能需要自定义配置文件,来实现更加灵活和个性化的配置。因为自定义的配置文件并不会被应用自动加载,所以需要我们手动指定加载。

具体来说就是使用 @PropertySource注解指定 自定义配置文件的路径,这样就可以将 自定义配置文件 加载到 Spring 的上下文中;然后就可以通过 @Value@ConfigurationPropertiesEnvironment三种不同的方式读取配置文件中的属性值了。

自定义配置文件

在 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 {

}

如果有帮助的话,可以点个赞支持一下嘛🙏