2023-09-15  阅读(34)
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105729211

PropertySourceBootstrapConfiguration

自动配置里有这个类,这个就是来进行远程配置处理的。

202309152315292061.png
他也是个初始化器,因为在准备好上下文,刷新前applyInitializers方法中进行处理:

202309152315298182.png
而且他有个注入属性,我们上一篇已经注入了nacosNacosPropertySourceLocator了:

202309152315304703.png

initialize初始化一

方法太长,做的事又多,先分析一部分,首先就是将属性源定位器propertySourceLocators排序,然后遍历进行定位,放进封装成PropertySource并放进集合里。

    @Override
    	public void initialize(ConfigurableApplicationContext applicationContext) {
    		List<PropertySource<?>> composite = new ArrayList<>();
    		AnnotationAwareOrderComparator.sort(this.propertySourceLocators);
    		boolean empty = true;
    		ConfigurableEnvironment environment = applicationContext.getEnvironment();
    		for (PropertySourceLocator locator : this.propertySourceLocators) {
    			Collection<PropertySource<?>> source = locator.locateCollection(environment);
    			if (source == null || source.size() == 0) {
    				continue;
    			}
    			List<PropertySource<?>> sourceList = new ArrayList<>();
    			for (PropertySource<?> p : source) {
    				sourceList.add(new BootstrapPropertySource<>(p));
    			}
    			logger.info("Located property source: " + sourceList);
    			composite.addAll(sourceList);
    			empty = false;
    		}

NacosPropertySourceLocator的locate

接口默认方法层层深入,到NacosPropertySourceLocatorlocate

202309152315313544.png

202309152315318315.png
先准备设置一堆属性,然后进行共享配置和额外配置的加载,默认都是没有的,可以不管,主要是loadApplicationConfiguration

    	@Override
    	public PropertySource<?> locate(Environment env) {
    		nacosConfigProperties.setEnvironment(env);//设置环境
    		ConfigService configService = nacosConfigManager.getConfigService();//获取配置服务
    
    		if (null == configService) {
    			log.warn("no instance of config service found, can't load config from nacos");
    			return null;
    		}
    		long timeout = nacosConfigProperties.getTimeout();//超时30秒
    		nacosPropertySourceBuilder = new NacosPropertySourceBuilder(configService,
    				timeout);//属性源建造器
    		String name = nacosConfigProperties.getName();//dataid的名字
    
    		String dataIdPrefix = nacosConfigProperties.getPrefix();//前缀
    		if (StringUtils.isEmpty(dataIdPrefix)) {
    			dataIdPrefix = name;
    		}
    
    		if (StringUtils.isEmpty(dataIdPrefix)) {//前缀为空的话默认就是spring.application.name
    			dataIdPrefix = env.getProperty("spring.application.name");
    		}
    		//创建符合属性源
    		CompositePropertySource composite = new CompositePropertySource(
    				NACOS_PROPERTY_SOURCE_NAME);
    
    		loadSharedConfiguration(composite);
    		loadExtConfiguration(composite);
    		loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);
    
    		return composite;
    	}

NacosPropertySourceLocator的loadApplicationConfiguration加载应用程序配置

先获取配置的扩展名和费祖,然后进行3次加载,第一次是默认文件名的配置加载,第二次是默认文件名加后缀,第三次是默认文件名加激活的环境加后缀,也就是我们经常用激活环境的配置文件xxx-dev-yaml这种。加载后的信息都要放入CompositePropertySource符合属性里,到时候要返回出去的。

    	private void loadApplicationConfiguration(
    			CompositePropertySource compositePropertySource, String dataIdPrefix,
    			NacosConfigProperties properties, Environment environment) {
    		String fileExtension = properties.getFileExtension();//扩展名
    		String nacosGroup = properties.getGroup();//分组,默认DEFAULT_GROUP
    		// load directly once by default 直接默认配置文件加载一次
    		loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,
    				fileExtension, true);
    		// load with suffix, which have a higher priority than the default
    		loadNacosDataIfPresent(compositePropertySource,//文件名加后缀来一次
    				dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);
    		// Loaded with profile, which have a higher priority than the suffix
    		for (String profile : environment.getActiveProfiles()) {//有环境配置的更高级别
    			String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;
    			loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,
    					fileExtension, true);
    		}
    
    	}

具体怎么加载的后面说吧。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文