iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot扩展外部化配置的原理解析
  • 388
分享到

SpringBoot扩展外部化配置的原理解析

2024-04-02 19:04:59 388人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

Environment实现原理 在基于SpringBoot开发的应用中,我们常常会在application.properties、application-xxx.properties

Environment实现原理

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


# application.properties
my.config.appId=demo

@RestController
public 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是同一个对象,在springConfigurableEnvironmentEnvironment的子类,具体实现类全部是通过implements ConfigurableEnvironment接口来实现,所以所有可以拿到Environment接口地方都可以强制转换为ConfigurableEnvironment

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

在这里插入图片描述


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接口,获取外部化配置。

在这里插入图片描述

扩展接口及优先级如下

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

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

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

1. 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扩展外部化配置的原理解析的文章就介绍到这了,更多相关SpringBoot扩展外部化配置内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot扩展外部化配置的原理解析

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

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

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

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

下载Word文档
猜你喜欢
  • SpringBoot扩展外部化配置的原理解析
    Environment实现原理 在基于SpringBoot开发的应用中,我们常常会在application.properties、application-xxx.properties...
    99+
    2024-04-02
  • SpringBoot扩展外部化配置的原理是什么
    这篇文章给大家分享的是有关SpringBoot扩展外部化配置的原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Environment实现原理在基于SpringBoot开发的应用中,我们常常会在applic...
    99+
    2023-06-14
  • SpringBoot外部化如何配置
    这篇文章主要介绍了SpringBoot外部化如何配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot外部化如何配置文章都会有所收获,下面我们一起来看看吧。SpringBoot外部化配置(基于2...
    99+
    2023-07-05
  • springboot自动配置原理解析
    目录前言开始总结前言 小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用的是strust2或者是springm...
    99+
    2024-04-02
  • SpringBoot中怎么支持外部化配置
    Spring Boot支持外部化配置主要通过以下几种方式: 配置文件:Spring Boot支持多种格式的配置文件,包括prop...
    99+
    2024-04-09
    SpringBoot
  • Springboot自动加载配置的原理解析
    目录1、springboot自动配置的原理初探2. 补充扩展(解释为什么引用的包都报红错了,项目还能启动)3、又一个问题总结1、springboot自动配置的原理初探 以下注解都在...
    99+
    2024-04-02
  • 详解Spring中的Environment外部化配置管理
    目录profilesProfileService声明一个配置类定义测试方法profiles总结Propertiesenvironment的应用指定profile属性@Value注解的...
    99+
    2024-04-02
  • Spring Cloud 中自定义外部化扩展机制原理及实战记录
    目录自定义PropertySource扩展PropertySourceLocatorSpring.factories编写controller测试阶段性总结SpringApplicat...
    99+
    2024-04-02
  • Springboot启动原理和自动配置原理解析
    目录启动原理SpringApplication1、初始化2、调用run方法自动配置原理放本地文件夹都快吃土了,准备清理文件夹,关于Springboot的! 启动原理 @SpringB...
    99+
    2023-05-17
    Springboot启动原理和自动配置 Springboot自动配置 Springboot启动
  • SpringBoot自动配置的原理分析
    这篇文章主要介绍了SpringBoot自动配置的原理分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot自动配置的原理分析文章都会有所收获,下面我们一起来看看吧。初始化一个Springboot...
    99+
    2023-06-08
  • SpringBoot中热部署配置深入讲解原理
    目录热部署springboot项目热部署实现原理在springboot中进行热部署操作步骤重启与重载自动启动热部署参与热部署监控的文件范围配置关闭热部署总结热部署   &n...
    99+
    2023-01-28
    SpringBoot热部署配置 SpringBoot热部署
  • SpringBoot 自动配置原理及源码解析
    初始化一个Springboot项目,在主启动类会有这么一个注解:@SpringBootApplication,自动装配的秘密全在主启动类这个注解里面了 点进去一层会发现有三个子注解组...
    99+
    2024-04-02
  • Springboot-yaml配置和自动配置的原理分析
    本篇内容主要讲解“Springboot-yaml配置和自动配置的原理分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Springboot-yaml配置和自动配置的原理分析”吧!版本仲裁中心sp...
    99+
    2023-06-08
  • 全面解析SpringBoot自动配置的实现原理
    之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配置的功能,我们编写一个最简单的自动配置功...
    99+
    2023-05-31
    spring boot 配置
  • Springboot-yaml配置和自动配置原理分析
    目录版本仲裁中心自动配置原理yaml语法和@PropertySource注解一起使用和@ImportResource一起使用配置文件占位符profile配置文件的加载顺序版本仲裁中心...
    99+
    2024-04-02
  • SpringBoot server.port配置原理详解
    目录SpringBoot server.port配置原理1. autoConfigure2. embed tomcat如何使用小结一下server.port不起作用SpringBoo...
    99+
    2024-04-02
  • Springboot内外部logback多环境配置的示例分析
    这篇文章给大家分享的是有关Springboot内外部logback多环境配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、概述SpringBoot官方文档Springboot 默认读取的是项目内的 ...
    99+
    2023-06-26
  • Springboot内外部logback多环境配置详解
    目录一、概述二、项目内外配置三、使用自定义appender四、logback查找配置源码五、案例源码一、概述 SpringBoot官方文档Springboot 默认读取的是项目内的 ...
    99+
    2024-04-02
  • SpringBoot自动配置原理的示例分析
    这篇文章主要介绍了SpringBoot自动配置原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、SpringBoot是什么SpringBoot 的诞生就是为了简...
    99+
    2023-06-22
  • SpringBoot自动配置原理详解
    目录阅读收获一、SpringBoot是什么二、SpringBoot的特点三、启动类3.1 @SpringBootApplication四、@EnableAutoConfigurati...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作