聊聊NacosConfigAutoConfiguration

10次阅读

共计 4018 个字符,预计需要花费 11 分钟才能阅读完成。

本文主要研究一下 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

  • NacosConfigAutoConfiguration
正文完
 0