SpringBoot加载配置的6种方式

Environment对象

        Environment是springboot核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等,使用Environment方式来获取配置属性值非常简单,只要注入Environment类调用其方法 getProperty(属性key) 即可。

注入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注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量、方法参数和构造函数参数上, 在应用程序启动时,使用@Value注解的Bean会被实例化。所有使用了@Value注解的Bean会被加入到PropertySourcesPlaceholderConfigurer的后置处理器集合中。当后置处理器开始执行时,它会读取Bean中所有@Value注解所标注的值,并通过反射将解析后的属性值赋值给标有@Value注解的成员变量、方法参数和构造函数参数。

 注意:

①在使用@Value注解时需要确保注入的属性值已经加载到Spring容器中,否则会导致注入失败;

②建议引用变量的时候给定一个默认值,避免启动报“缺失配置”的错误;

③通过依赖注入的方式获取对象中属性值,切记不要使用new的方式来创建对象获取其属性。

只要在变量上加注解@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

SpringBoot提供的一种更加便捷来处理配置文件中的属性值的方式,可以通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean对象上。

application.yml配置文件中添加配置项:

env:
  var1: 变量值1
  var2: 变量值2

创建一个MyConf类用于承载所有前缀为env的配置属性。

@Data
@Configuration
@ConfigurationProperties(prefix = "env")
public class MyConf {

    private String var1;
    
    private String var2;
}

 在需要使用var1var2属性值的地方,将MyConf对象注入到依赖对象中即可。

@Slf4j
@SpringBootTest
public class ConfTest {

    @Resource
    private MyConf myConf;

    @Test
    public void myConfTest() {
        log.info("@ConfigurationProperties注解获取的配置内容:{}", JSON.toJSONString(myConf));
    }
}

 

@PropertySources 

@PropertySources注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到Environment中,这样可以通过@Value注解或 Environment.getProperty()方法来获取其中定义的属性值了。默认只限读取properties文件内容,想加载yaml文件内容,可以自定义factory适配器,指定factory具体的使用。 

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文件,通过@Value注解或Environment.getProperty()方法来配合着获取其中定义的属性值。

@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原生 

通过java.util.Properties去加载配置文件中的属性。

@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"));
    }
}

 

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值