- 前言
- 前置知识
- 具体实践
- demo
- 关键点
- 思路
- 另外一种思路
- 参考博客
配置中心配置注入的时候有两个,一个是启动前,一个是配置变化之后进行动态配置。本篇主要总结启动前配置注入spring环境。
前置知识spring配置会将配置储存到PropertySource数据结构,可以通过MapPropertySource拿到source拿到对应的配置,或者增删查配置
也可以通过
@Autowired private ConfigurableEnvironment environment;
在运行时 *** 作配置项
具体实践实现类继承BeanFactoryPostProcessor,是由于项目起来前直接 *** 作修改配置项
继承EnvironmentAware,可以 *** 作spring配置项
import lombok.SneakyThrows; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.EnvironmentAware; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; import javax.annotation.PostConstruct; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Iterator; @Component public class Test implements EnvironmentAware,BeanFactoryPostProcessor { @PostConstruct public void setup() throws FileNotFoundException { } @SneakyThrows @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } @SneakyThrows @Override public void setEnvironment(Environment environment) { Yaml yaml = new Yaml(); Config config = yaml.loadAs(new FileInputStream(new File("D:\project\longPolling-demo\src\main\java\moe\cnkirito\demo\xx.yaml")), Config.class); ((ConfigurableEnvironment) environment).getPropertySources() // 这里是 addFirst,优先级高于 application.properties 配置 .addFirst(new PropertySource("applicationConfig", config.getA().getB()) { // 重点 @Override public Object getProperty(String s) { if (s.equals("a.b")) {// return source;// 返回构造方法中的 source :12345 } return null; } }); } }
Yaml是模拟apoll,nacos等等yml配置,读取之后转成Map
// 重点 @Override public Object getProperty(String s) { if (s.equals("a.b")) {// return source;// 返回构造方法中的 source :12345 } return null; }
比如说我用@Value("${a.b}")去拿取值,getProperty的时候会判断,如果一样的话,会返回source,也就是new PropertySource(“name”, source);
name 不重要,保存后会生成a.b = 8888,PropertySource参数name,然后source,类型是map,key以及object,所以打印出来 key = value
可以在这个类写请求远程配置中心的数据,然后转map
比如说
a: b: ${a.b}
我们可以通过往spring配置中塞入a.b的值,然后让启动的时候也写进去。甚至改写启动的端口。
类似nacos,apoll也差不多,就是把这些配置写到spring配置中
另外一种思路背景:在没有注册中心的情况下,比如用云原生的技术,你在本地是拿不到配置的,这时需要去k8s拉取配置。
思路:可以写maven插件,在编译的时候(如果是打包环境,你都打完包了,还玩个锤子),拉取k8s配置,yaml load加载,然后dump到application.yml里面。
前置知识:spring读取配置顺序
- 根目录下
- 根目录中config目录下
- resources目录下
- resources目录中config目录下
- Apollo-5-教你怎么把自己的配置放到-Spring-环境中
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)