聊聊NacosConfigAutoConfiguration

  • 2019 年 10 月 8 日
  • 筆記

本文主要研究一下NacosConfigAutoConfiguration

NacosConfigAutoConfiguration

nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigAutoConfiguration.java

@ConditionalOnProperty(name = NacosConfigConstants.ENABLED, matchIfMissing = true)  @ConditionalOnMissingBean(name = CONFIG_GLOBAL_NACOS_PROPERTIES_BEAN_NAME)  @EnableConfigurationProperties(value = NacosConfigProperties.class)  @ConditionalOnClass(name = "org.springframework.boot.context.properties.bind.Binder")  @Import(value = {NacosConfigBootBeanDefinitionRegistrar.class})  @EnableNacosConfig  public class NacosConfigAutoConfiguration {  ​  }
  • NacosConfigAutoConfiguration导入了NacosConfigBootBeanDefinitionRegistrar

NacosConfigBootBeanDefinitionRegistrar

nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigBootBeanDefinitionRegistrar.java

@Configuration  public class NacosConfigBootBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {  ​      @Override      public void setBeanFactory(BeanFactory beanFactory) throws BeansException {          DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;          BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder                  .rootBeanDefinition(NacosBootConfigurationPropertiesBinder.class);          defaultListableBeanFactory.registerBeanDefinition(NacosBootConfigurationPropertiesBinder.BEAN_NAME, beanDefinitionBuilder.getBeanDefinition());      }  ​      @Override      public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {  ​      }  }
  • NacosConfigBootBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar, BeanFactoryAware接口;其setBeanFactory方法注册了nacosConfigurationPropertiesBinder

NacosBootConfigurationPropertiesBinder

nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/binder/NacosBootConfigurationPropertiesBinder.java

public class NacosBootConfigurationPropertiesBinder extends NacosConfigurationPropertiesBinder {  ​      private final Logger logger = LoggerFactory.getLogger(NacosBootConfigurationPropertiesBinder.class);  ​      private ConfigurableApplicationContext context;      private ConfigurationBeanFactoryMetadata beanFactoryMetadata;  ​      public NacosBootConfigurationPropertiesBinder(ConfigurableApplicationContext applicationContext) {          super(applicationContext);          this.context = applicationContext;          this.beanFactoryMetadata = applicationContext.getBean(                  ConfigurationBeanFactoryMetadata.BEAN_NAME,                  ConfigurationBeanFactoryMetadata.class);      }  ​      @Override      protected void doBind(Object bean, String beanName, String dataId, String groupId, String configType,                            NacosConfigurationProperties properties, String content, ConfigService configService) {          String name = "nacos-bootstrap-" + beanName;          NacosPropertySource propertySource = new NacosPropertySource(name, dataId, groupId, content, configType);          context.getEnvironment().getPropertySources().addLast(propertySource);          Binder binder = Binder.get(context.getEnvironment());          ResolvableType type = getBeanType(bean, beanName);          Bindable<?> target = Bindable.of(type).withExistingValue(bean);          binder.bind(properties.prefix(), target);          publishBoundEvent(bean, beanName, dataId, groupId, properties, content, configService);          publishMetadataEvent(bean, beanName, dataId, groupId, properties);          context.getEnvironment().getPropertySources().remove(name);      }  ​      private ResolvableType getBeanType(Object bean, String beanName) {          Method factoryMethod = this.beanFactoryMetadata.findFactoryMethod(beanName);          if (factoryMethod != null) {              return ResolvableType.forMethodReturnType(factoryMethod);          }          return ResolvableType.forClass(bean.getClass());      }  ​  }
  • NacosBootConfigurationPropertiesBinder继承了NacosConfigurationPropertiesBinder;其doBind方法会创建NacosPropertySource,然后添加到context.getEnvironment().getPropertySources(),之后通过Binder.get(context.getEnvironment())的bind方法进行绑定

小结

NacosConfigAutoConfiguration导入了NacosConfigBootBeanDefinitionRegistrar;NacosConfigBootBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar, BeanFactoryAware接口;其setBeanFactory方法注册了nacosConfigurationPropertiesBinder

doc