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 中。