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