iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot扩展外部化配置的原理是什么
  • 517
分享到

SpringBoot扩展外部化配置的原理是什么

2023-06-14 06:06:05 517人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关SpringBoot扩展外部化配置的原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Environment实现原理在基于springBoot开发的应用中,我们常常会在applic

这篇文章给大家分享的是有关SpringBoot扩展外部化配置的原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Environment实现原理

在基于springBoot开发的应用中,我们常常会在application.propertiesapplication-xxx.propertiesapplication.ymlapplication-xxx.yml等配置文件中设置一些属性值,然后通过@Value@ConfigurationProperties等注解获取,或者采用编码的方式通过Environment获取。

# application.propertiesmy.config.appId=demo
@RestControllerpublic class WEBController { @Value("${my.config.appId}") private String appId; @Autowired private Environment env; @Autowired private ConfigurableEnvironment environment; @GetMapping("/appInfo") public String appInfo() {  System.out.println(environment.getProperty("my.config.appId"));  System.out.println(env.getProperty("my.config.appId"));  System.out.println(appId);  System.out.println(env == environment); //true  return appId; }}

实际上envenvironment是同一个对象,在Spring中ConfigurableEnvironmentEnvironment的子类,具体实现类全部是通过implements ConfigurableEnvironment接口来实现,所以所有可以拿到Environment接口地方都可以强制转换为ConfigurableEnvironment

ConfigurableEnvironment继承EnvironmentEnvironment继承PropertyResolver,主要提供了对属性获取方法,AbstractEnvironment做为抽象类实现了ConfigurableEnvironment接口方法,其内部是通过org.springframework.core.env.MutablePropertySources来保存不同类型的属性资源。而MutablePropertySources内部实际上就是List<PropertySource<?>>集合

SpringBoot扩展外部化配置的原理是什么

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {void setActiveProfiles(String... profiles);void addActiveProfile(String profile);void setDefaultProfiles(String... profiles); //MutablePropertySources 内部实际上就是**List<PropertySource<?>>集合MutablePropertySources getPropertySources();Map<String, Object> getSystemProperties();Map<String, Object> getSystemEnvironment();void merge(ConfigurableEnvironment parent);}

PropertySource是什么呢?

其实就是一个key-value集合,key就是一个配置项,value就是配置的值。
例如: 通过System.getProperties()得到的系统属性就是一种类型的PropertySource,通过application.yml配置的属性是另一种属性资源。当调用env.getProperty()获取属性值时,会遍历PropertySource集合,只要有一个PropertySource中有对应属性值则不再继续遍历查找,所以在集合中越靠前的属性优先级越高

获取某个配置项值的访问方式,源码如下:
org.springframework.core.env.PropertySourcesPropertyResolver#getProperty(java.lang.String, java.lang.Class<T>, boolean)

protected <T> T getProperty(String key, Class<T> targetValueType, boolean resolveNestedPlaceholders) {if (this.propertySources != null) {for (PropertySource<?> propertySource : this.propertySources) {if (logger.isTraceEnabled()) {logger.trace("Searching for key '" + key + "' in PropertySource '" + propertySource.getName() + "'");}Object value = propertySource.getProperty(key);if (value != null) {if (resolveNestedPlaceholders && value instanceof String) {value = resolveNestedPlaceholders((String) value);}logKeyFound(key, propertySource, value);return convertValueIfNecessary(value, targetValueType);}}}if (logger.isTraceEnabled()) {logger.trace("Could not find key '" + key + "' in any property source");}return null;}

如何扩展自己的外部化配置?

实际上我们可以利用SpringBoot中的扩展点,拿到ConfigurableEnvironment对象来获取到MutablePropertySources,添加自己的PropertySource就行,例如可以访问一个Http接口,获取外部化配置。

SpringBoot扩展外部化配置的原理是什么

扩展接口及优先级如下

梯形缩进表示内部调用了下面的接口实现

1.org.springframework.boot.SpringApplicationRunListener#environmentPrepared(ConfigurableBootstrapContext, ConfigurableEnvironment)

ApplicationListener< org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent> EnvironmentPostProcessorApplicationListener

org.springframework.boot.env.EnvironmentPostProcessor 1.org.springframework.boot.context.config.ConfigDataLoader 1.org.springframework.boot.env.PropertySourceLoader 1.org.springframework.context.ApplicationContextInitializer#initialize

1.org.springframework.boot.SpringApplicationRunListener#contextPrepared 4.org.springframework.boot.context.event.ApplicationPreparedEvent 5.org.springframework.beans.factory.support.BeanDefinitionReGIStryPostProcessor#postProcessBeanDefinitionRegistryorg.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory

但是在4.BeanDefinitionRegistryPostProcessor和5.BeanFactoryPostProcessor中扩展时机比较晚,这个时候已经执行完包扫描,如果在这个时机添加自己的外部化配置,对于注解@ConditionalOnProperty可能大部分不会生效

Apollo配置中心客户端和SpringBoot的整合实现

Apollo配置中心客户端是如何与SpringBoot整合的?

开源的Apollo配置中心默认启动就是通过BeanFactoryPostProcessor来扩展apollo上的配置到Spring的Environment中,
@EnableApolloConfig 注解向Spring中导入了bean com.ctrip.framework.apollo.spring.config.PropertySourcesProcessorPropertySourcesProcessor同时实现了org.springframework.core.PriorityOrdered并设置了最高的执行优先级Ordered.HIGHEST_PRECEDENCE,但是由于包扫描已经在PropertySourcesProcessor之前执行完成,所以即使设置了最高优先级,同样无法解决在Spring执行包扫描阶段访问不到apllo上的配置问题

因此在SpringBoot项目中,apollo提供了另一种启动方式,使用配置项apollo.bootstrap.enabled = true来解决,实现类为com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer,其主要是通过实现第2个扩展接口org.springframework.context.ApplicationContextInitializer来提前将apollo的PropertySource添加到Spring的Environment中。
这样我们就可以通过Environment来获取到apollo中的配置项值。而@ConditionalOnProperty则是从Environment获取属性值来判断的条件是否成立,因此使用该接口扩展Environment,@ConditionalOnProperty注解则可以在启动阶段正常访问到apollo中的配置项。

感谢各位的阅读!关于“SpringBoot扩展外部化配置的原理是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: SpringBoot扩展外部化配置的原理是什么

本文链接: https://www.lsjlt.com/news/268213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot扩展外部化配置的原理是什么
    这篇文章给大家分享的是有关SpringBoot扩展外部化配置的原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Environment实现原理在基于SpringBoot开发的应用中,我们常常会在applic...
    99+
    2023-06-14
  • SpringBoot扩展外部化配置的原理解析
    Environment实现原理 在基于SpringBoot开发的应用中,我们常常会在application.properties、application-xxx.properties...
    99+
    2024-04-02
  • SpringBoot中怎么支持外部化配置
    Spring Boot支持外部化配置主要通过以下几种方式: 配置文件:Spring Boot支持多种格式的配置文件,包括prop...
    99+
    2024-04-09
    SpringBoot
  • springboot自动配置原理是什么
    Spring Boot的自动配置原理是基于条件注解和条件判断的。Spring Boot通过在配置类上使用@EnableAutoCon...
    99+
    2023-08-23
    springboot
  • SAP S/4HANA extensibility扩展原理是什么
    这篇文章将为大家详细讲解有关SAP S/4HANA extensibility扩展原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。下面是S/4HANA extensibility扩展...
    99+
    2023-06-04
  • Spring Cloud 中自定义外部化扩展机制原理及实战记录
    目录自定义PropertySource扩展PropertySourceLocatorSpring.factories编写controller测试阶段性总结SpringApplicat...
    99+
    2024-04-02
  • SAP S/4HANA CDS view的扩展原理是什么
    这篇文章主要讲解了“SAP S/4HANA CDS view的扩展原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SAP S/4HANA CDS view的扩展原理是什么”吧!Whe...
    99+
    2023-06-03
  • SpringBoot外化配置源码的参数及配置是怎样的
    SpringBoot外化配置源码的参数及配置是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。综合实战我们讲解了关于 Spring B...
    99+
    2024-04-02
  • SAP CRM CUSTOMER_H扩展字段的设计原理是什么
    这篇文章的内容主要围绕SAP CRM CUSTOMER_H扩展字段的设计原理是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!INCL_EEW_C...
    99+
    2023-06-04
  • 浅谈什么是SpringBoot异常处理自动配置的原理
    异常处理自动配置 ErrorMvcAutoConfiguration自动配置类自动配置了处理规则,给容器中注册了多种组件 errorAttributes组件,类型为DefaultEr...
    99+
    2024-04-02
  • 什么是PostgreSQL的扩展,如何安装和管理扩展
    PostgreSQL的扩展是一种可以添加额外功能或功能性的模块,可以通过安装和加载来扩展PostgreSQL的功能。扩展可以包括新的...
    99+
    2024-04-09
    PostgreSQL
  • php要用swoole扩展的原因是什么
    这篇文章主要介绍“php要用swoole扩展的原因是什么”,在日常操作中,相信很多人在php要用swoole扩展的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php要用swoole扩展的原因是什么...
    99+
    2023-07-05
  • 详解Spring中的Environment外部化配置管理
    目录profilesProfileService声明一个配置类定义测试方法profiles总结Propertiesenvironment的应用指定profile属性@Value注解的...
    99+
    2024-04-02
  • java SpringBoot自动装配原理是什么
    这篇文章主要介绍“java SpringBoot自动装配原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java SpringBoot自动装配原理是什么”文章能帮助大家解决问题。summar...
    99+
    2023-07-06
  • php没有mbstring扩展的设置是什么原因?怎么解决?
    近年来,PHP语言一直以来都是互联网行业最为广泛使用的一种语言,被广泛运用于Web开发、数据处理、接口开发等领域。但是在使用PHP开发项目时,难免会遇到各种问题,其中之一就是在进行字符串处理时会出现乱码的情况。而解决这个问题的方法之一就是使...
    99+
    2023-05-14
    php
  • springboot启动的原理是什么
    Spring Boot的启动原理可以分为以下几个步骤: 加载依赖:Spring Boot会根据项目的配置文件(如pom.xml)...
    99+
    2023-10-26
    springboot
  • spring boot自动配置的原理是什么
    Spring Boot的自动配置原理是基于条件注解和Spring的条件注解机制实现的。在Spring Boot中,自动配置是通过在类...
    99+
    2023-08-31
    spring boot
  • java数组扩容的原理是什么
    Java数组扩容的原理是通过创建一个新的更大的数组,然后将原数组中的元素复制到新数组中。下面是具体的步骤: 当数组需要扩容时,首...
    99+
    2023-10-27
    java
  • golang切片扩容的原理是什么
    在Go语言中,切片(slice)是一种动态数组的抽象。切片的长度可以根据需要自动扩容,而扩容的机制是通过创建一个更大的底层数组并将原...
    99+
    2024-02-29
    golang
  • SpringBoot原理中自动配置机制是怎样的
    本篇文章为大家展示了SpringBoot原理中自动配置机制是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在当下的java生态里,SpringBoot已经成为事实上的开发标准,绝大多数人现...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作