手写分布式配置中心(五)整合springboot(不自动刷新的)

springboot中使用配置方式有四种,分别是environment、BeanDefinition、@Value、@ConfigurationProperties。具体的原理可以看我之前的一篇文章https://blog.csdn.net/cjc000/article/details/132800290。代码在https://gitee.com/summer-cat001/config-center

原理

environment是存储配置的地方,其他的都是从这里获取的数据。所以只要在他们用到配置之前,把配置放到environment中就可以了,先看下springboot的启动流程图。

可以看到业务代码第一次用到配置的地方是PropertySourcesPlaceholderConfigurer,它是一个BeanFactoryPostProcessor默认的order是最低优先级的,所以只要在执行它之前把配置放到environment对象中即可,如图标红的地方

不过很多三方的jar包可能会会自定义ApplicationContextInitializer和BeanFactoryPostProcessor。所以为了让这些jar包也用到我们的配置,所以要在更早的阶段加载配置,既然springboot提供了加载配置的扩展点,那我们直接注册一个自定义的EnvironmentPostProcessor类即可,不过因为我们加载配置的时候也要使用application.yml的配置,比如设置连接地址什么的,所以需要把我们的EnvironmentPostProcessor的优先级设置的小于ConfigDataEnvironmentPostProcessor,ConfigDataEnvironmentPostProcessor的优先级是Ordered.HIGHEST_PRECEDENCE + 10,我们只要把order设置成Ordered.HIGHEST_PRECEDENCE + 11即可

代码

ConfigCenterClient改为单例

 private static volatile ConfigCenterClient client;private ConfigCenterClient(String url) {this.url = url;//将配置中心的配置转换成property格式,即user.name=xxxList<ConfigVO> configList = getAllValidConfig();this.configMap = configList2ConfigMap(configList);}public static ConfigCenterClient getInstance(String url) {return Optional.ofNullable(client).orElseGet(() -> {synchronized (ConfigCenterClient.class) {if (client == null) {client = new ConfigCenterClient(url);}return client;}});}

自定义EnvironmentPostProcessor

public class ConfigEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {String configCenterUrl = environment.getProperty("config.center.url");ConfigCenterClient configCenterClient = ConfigCenterClient.getInstance(configCenterUrl);Map<String, Object> configProperty = configCenterClient.getConfigProperty();MutablePropertySources propertySources = environment.getPropertySources();MapPropertySource configCenter = new MapPropertySource("configCenter", configProperty);propertySources.addFirst(configCenter);}
}

注册EnvironmentPostProcessor

org.springframework.boot.env.EnvironmentPostProcessor=\
com.config.center.config.ConfigEnvironmentPostProcessor

效果

environment对象获取配置

@Autowiredprivate Environment environment;@Testpublic void configTest() {String userName = environment.getProperty("user.name");System.out.println(userName);}

xml中获取配置

public class User {private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"default-lazy-init="false"><bean id="user" class="com.config.center.test.User"><property name="userName" value="${user.name}"/></bean></beans>

@Value获取配置

    @Value("${user.name}")private String name;@Testpublic void configTest() {System.out.println(name);}

@ConfigurationProperties

@Component
@ConfigurationProperties(prefix = "user")
public class UserConfig {private String name;private int age;private List<String> education;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<String> getEducation() {return education;}public void setEducation(List<String> education) {this.education = education;}
}
    @Autowiredprivate UserConfig userConfig;@Testpublic void configTest() {System.out.println(userConfig);}

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/521173.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凌鲨微应用开发流程

微应用开发流程 使用vite,nextjs等框架创建前端项目引入需要的api包通过调试界面进行调试 创建前端项目 vite yarn create vitenextjs yarn create next-app引入需要的api包 名称权限说明http跨域访问跨域http访问tauri提供的apilinksaas-minapp/api打开浏览器读本地文件…

0环PEB断链

在操作系统层面上&#xff0c;进程本质上就是一个结构体&#xff0c;当操作系统想要创建一个进程时&#xff0c;就分配一块内存&#xff0c;填入一个结构体&#xff0c;并为结构体中的每一项填充一些具体值。而这个结构体&#xff0c;就是EPROCESS 在0x088 偏移处有一个指针Act…

林业数据可视化新篇章:山海鲸软件看板设计心得

可视化看板作为一种直观、高效的数据展示工具&#xff0c;对于提升管理水平和决策效能具有重要意义。作为一名山海鲸可视化软件的资深用户&#xff0c;我深知其设计方面的强大实力和便捷性&#xff0c;同时由于其免费可视化编辑、免费私有化部署的特点&#xff0c;使我能自由探…

数字时代下的内部审计蜕变:探索数字化转型的七大关键领域

写在前面 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应用。广义…

Pytorch线性回归实现(原理)

设置梯度 直接在tensor中设置 requires_gradTrue&#xff0c;每次操作这个数的时候&#xff0c;就会保存每一步的数据。也就是保存了梯度相关的数据。 import torch x torch.ones(2, 2, requires_gradTrue) #初始化参数x并设置requires_gradTrue用来追踪其计算历史 print(x…

爬虫实战——巴黎圣母院新闻【内附超详细教程,你上你也行】

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

操作系统发布时间表(1984-2024年)

操作系统发布时间表&#xff08;1984-2024年&#xff09; 80年代90年代00年代10年代20年代 80年代 时间WindowsAppleBSDLinuxOthers1984-01Mac OS (System 1.0)1985-11Windows 1.01987MINIX1987-12Windows 2.01988-04Mac OS (System 6.0)1988-05Windows 2.1 90年代 时间Window…

Linux进程管理:(四)组调度机制

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 组调度 CFS的调度粒度是进程&am…

FMEA的局限性表现在哪些方面——SunFMEA软件系统

FMEA作为一种常用的故障分析和风险评估工具&#xff0c;被广泛应用于工程、制造、服务等领域。尽管FMEA具有很多优点&#xff0c;但在实际应用中&#xff0c;我们也必须认识到其存在的局限性。本文SunFMEA软件将从多个方面探讨FMEA的局限性。 首先&#xff0c;FMEA主要关注产品…

Keepalive 解决nginx 的高可用问题

一 说明 keepalived利用 VRRP Script 技术&#xff0c;可以调用外部的辅助脚本进行资源监控&#xff0c;并根据监控的结果实现优先动态调整&#xff0c;从而实现其它应用的高可用性功能 参考配置文件&#xff1a; /usr/share/doc/keepalived/keepalived.conf.vrrp.localche…

【LeetCode: 149. 直线上最多的点数 + 模拟遍历】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

四、项目中Camunda的使用

公文流程 保存 //省略其他业务逻辑...... //获取公文的工作流程类型 String processDefinitionKeydocDTO.getDocDocType().getDocType().getWorkflowId(); //启动流程 //将工作流程类型作为流程实例id&#xff0c;公文id 作为流程中业务id this.runtimeService.start…