SpringBoot构建微服务实战 之 Configuration(三)

SpringBoot构建微服务实战 之 Configuration(三)

上一章我们学习SpringBoot 读取配置项的方法,本章我们将学习一下如何动态地读取非本地配置文件。


在分布式的系统中配置文件一般是被统一放在一个地方维护的,因而我们需要指定的配置文件是需要到配置文件中心去拿,这就牵涉到了一个问题如何使用SpringBoot 来动态地获取配置文件。下面我们将通过一个实例来学习SpringBoot如何动态读取外部配置文件。

  • 在 F:\Support 下有一个 dynamic.properties 配置文件

    dynamic.domain=Afric
  • MyEnvironmentPostProcessor.java

    package com.springBoot.entrance.configuration.dynamic;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.env.EnvironmentPostProcessor;
    import org.springframework.core.env.ConfigurableEnvironment;
    import org.springframework.core.env.PropertiesPropertySource;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
    
        /**
         * 动态获取Springboot配置文件信息
         * 在分布式的开发中 配置文件往往是几种管理的,因而启动服务所需的配置文件我们需要从指定的地点下载然后有SpringBoot读取,
         * 此时 自定义EnvironmentPostProcessor 将会很好地满足我们的需求,
         * 另外由于 EnvironmentPostProcessor 是由于Spring boot提供的,因而我们需要在  classpath 下 新建META-INF/spring.factories
         * 在Spring boot 启动是将spring.factories 中注册的Bean 纳入到Spring IOC 中统一管理。
         */
        public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
            try {
                InputStream input = new FileInputStream("F:/Support/dynamic.properties");
                Properties source = new Properties();
                source.load(input);
                PropertiesPropertySource propertySource = new PropertiesPropertySource("dynamic", source);
                environment.getPropertySources().addLast(propertySource);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
  • 在classpath:/META-INF 下新建一个 spring.factories 文件

    org.springframework.boot.env.EnvironmentPostProcessor=com.springBoot.entrance.configuration.dynamic.MyEnvironmentPostProcessor

    spring.factories 是一个注册配置,以本例子为例 由于 EnvironmentPostProcessor 时 SpringBoot 的而不是Spring 的因而在Spring IOC Contain初始化是我们需要将 EnvironmentPostProcessor 指定的实例注册到 IOC Contain中,本例子我们将 EnvironmentPostProcessor 的一个实例 MyEnvironmentPostProcessor注册到 IOC 中。

  • App.java(核心代码)

        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        System.out.println("dynamic.domain="+context.getEnvironment().getProperty("dynamic.domain"));
  • 结果

    2017-11-23 17:11:27.924  INFO 2104 --- [           main] com.springBoot.entrance.App              : Started App in 1.369 seconds (JVM running for 1.921)
    dynamic.domain=Afric

小结

  • 使用 EnvironmentPostProcessor 接口可以很好地满足我们动态地读取外部文件。

  • 使用 EnvironmentPostProcessor 时需要将 它的实现类实体注册到 spring IOC 中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值