聊聊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