ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

配置中心将配置写入spring环境

2021-11-11 10:31:33  阅读:181  来源: 互联网

标签:PropertySource spring 配置 写入 springframework source import org


文章目录

前言

配置中心配置注入的时候有两个,一个是启动前,一个是配置变化之后进行动态配置。本篇主要总结启动前配置注入spring环境。

前置知识

spring配置会将配置储存到PropertySource数据结构,可以通过MapPropertySource拿到source拿到对应的配置,或者增删查配置
也可以通过

@Autowired
  private ConfigurableEnvironment environment;

在运行时操作配置项

具体实践

实现类继承BeanFactoryPostProcessor,是由于项目起来前直接操作修改配置项
继承EnvironmentAware,可以操作spring配置项

demo

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<String>("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<String,Object> ,其实就是为了塞到PropertySource里头,然后再塞进Environment

关键点

					// 重点
                    @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<String,Object> 跟PropertySource结构一样,然后往里面塞入。

比如说

a:
 b: ${a.b}

我们可以通过往spring配置中塞入a.b的值,然后让启动的时候也写进去。甚至改写启动的端口。

类似nacos,apoll也差不多,就是把这些配置写到spring配置中

另外一种思路

背景:在没有注册中心的情况下,比如用云原生的技术,你在本地是拿不到配置的,这时需要去k8s拉取配置。

思路:可以写maven插件,在编译的时候(如果是打包环境,你都打完包了,还玩个锤子),拉取k8s配置,yaml load加载,然后dump到application.yml里面。

前置知识:spring读取配置顺序

  1. 根目录下
  2. 根目录中config目录下
  3. resources目录下
  4. resources目录中config目录下

参考博客

标签:PropertySource,spring,配置,写入,springframework,source,import,org
来源: https://blog.csdn.net/weixin_38336658/article/details/121261952

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有