聊聊NacosConfigEnvironmentProcessor
- 2019 年 10 月 8 日
- 筆記
序
本文主要研究一下NacosConfigEnvironmentProcessor

NacosConfigEnvironmentProcessor
nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigEnvironmentProcessor.java
public class NacosConfigEnvironmentProcessor implements EnvironmentPostProcessor, Ordered { private NacosConfigProperties nacosConfigProperties; private final LinkedList<NacosConfigUtils.DeferNacosPropertySource> deferPropertySources = new LinkedList<>(); private Function<Properties, ConfigService> builder = properties -> { try { // TODO And prevent to create a large number of ConfigService optimization point is given return NacosFactory.createConfigService(properties); } catch (NacosException e) { throw new NacosBootConfigException("ConfigService can't be created with properties : " + properties, e); } }; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { application.addInitializers(new NacosConfigApplicationContextInitializer(this)); nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment); if (enable()) { System.out.println("[Nacos Config Boot] : The preload log configuration is enabled"); loadConfig(environment); } } private void loadConfig(ConfigurableEnvironment environment) { NacosConfigUtils configUtils = new NacosConfigUtils(nacosConfigProperties, environment, builder); configUtils.loadConfig(); // set defer NacosPropertySource deferPropertySources.addAll(configUtils.getNacosPropertySources()); } boolean enable() { return nacosConfigProperties != null && nacosConfigProperties.getBootstrap().isLogEnable(); } LinkedList<NacosConfigUtils.DeferNacosPropertySource> getDeferPropertySources() { return deferPropertySources; } @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } }
- NacosConfigEnvironmentProcessor實現了EnvironmentPostProcessor, Ordered介面;其getOrder方法返回的是Ordered.LOWEST_PRECEDENCE
- 其postProcessEnvironment方法往SpringApplication添加了NacosConfigApplicationContextInitializer;同時使用NacosConfigPropertiesUtils.buildNacosConfigProperties創建了nacosConfigProperties
- 之後判斷是否preload log configuration,是的話則執行loadConfig方法,該方法通過NacosConfigUtils.loadConfig載入配置,最後將configUtils.getNacosPropertySources()添加到deferPropertySources
NacosConfigApplicationContextInitializer
nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigApplicationContextInitializer.java
public class NacosConfigApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { private final Logger logger = LoggerFactory.getLogger(NacosConfigApplicationContextInitializer.class); private ConfigurableEnvironment environment; private final NacosConfigEnvironmentProcessor processor; private NacosConfigProperties nacosConfigProperties; public NacosConfigApplicationContextInitializer(NacosConfigEnvironmentProcessor configEnvironmentProcessor) { this.processor = configEnvironmentProcessor; } @Override public void initialize(ConfigurableApplicationContext context) { CacheableEventPublishingNacosServiceFactory singleton = CacheableEventPublishingNacosServiceFactory.getSingleton(); singleton.setApplicationContext(context); environment = context.getEnvironment(); nacosConfigProperties = NacosConfigPropertiesUtils.buildNacosConfigProperties(environment); if (!enable()) { logger.info("[Nacos Config Boot] : The preload configuration is not enabled"); } else { Function<Properties, ConfigService> builder = properties -> { try { return singleton.createConfigService(properties); } catch (NacosException e) { throw new NacosBootConfigException("ConfigService can't be created with properties : " + properties, e); } }; NacosConfigUtils configUtils = new NacosConfigUtils(nacosConfigProperties, environment, builder); // If it opens the log level loading directly will cache DeferNacosPropertySource release if (processor.enable()) { configUtils.addListenerIfAutoRefreshed(processor.getDeferPropertySources()); } else { configUtils.loadConfig(); configUtils.addListenerIfAutoRefreshed(); } } } private boolean enable() { return processor.enable() || nacosConfigProperties.getBootstrap().isEnable(); } }
- NacosConfigApplicationContextInitializer實現了ApplicationContextInitializer介面;其initialize方法在開啟preload configuration的時候會創建NacosConfigUtils,若processor也開啟了preload configuration則會執行configUtils.addListenerIfAutoRefreshed(processor.getDeferPropertySources()),否則執行configUtils.loadConfig()及configUtils.addListenerIfAutoRefreshed()
小結
- NacosConfigEnvironmentProcessor實現了EnvironmentPostProcessor, Ordered介面;其getOrder方法返回的是Ordered.LOWEST_PRECEDENCE
- 其postProcessEnvironment方法往SpringApplication添加了NacosConfigApplicationContextInitializer;同時使用NacosConfigPropertiesUtils.buildNacosConfigProperties創建了nacosConfigProperties
- 之後判斷是否preload log configuration,是的話則執行loadConfig方法,該方法通過NacosConfigUtils.loadConfig載入配置,最後將configUtils.getNacosPropertySources()添加到deferPropertySources