springboot集成nacos读取nacos配置数据的原理

先前我们说了springboot应用集成nacos配置中心的过程,只需要引入一个jar包并在业务系统的配置文件中添加相关的nacos配置项,我们的系统就能获取到nacos服务上面维护的配置数据,那这个获取配置数据的原理是啥呢?接下来咱们就来聊聊这一块~

1、Nacos config springboot starter包

我们在springboot应用中集成nacos配置中心时,添加了以下依赖:

xml复制代码        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.11</version>
        </dependency>

它会自动导入nacos-config-spring-boot-autoconfigure包和其他nacos客户端jar包。

看到nacos-config-spring-boot-autoconfigure这种自动配置包,我们要先打开这个jar包,看下包目录下的/META-INF/spring.factories文件,里面有如下内容:

ini复制代码org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.alibaba.boot.nacos.config.autoconfigure.NacosConfigAutoConfiguration
#org.springframework.context.ApplicationContextInitializer=\
#  com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer
org.springframework.boot.env.EnvironmentPostProcessor=\
  com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor
org.springframework.context.ApplicationListener=\
  com.alibaba.boot.nacos.config.logging.NacosLoggingListener

本次我们关注的重点是org.springframework.boot.env.EnvironmentPostProcessor这个配置项的值,它只有一个值:

arduino复制代码com.alibaba.boot.nacos.config.autoconfigure.NacosConfigEnvironmentProcessor

我们来看下NacosConfigEnvironmentProcessor这个类,它有如下定义:

ini复制代码public class NacosConfigEnvironmentProcessor
        implements EnvironmentPostProcessor, Ordered {
    
       。。。。省略部分代码
           
        @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);
            NacosConfigLoader nacosConfigLoader = NacosConfigLoaderFactory.getSingleton(nacosConfigProperties, environment, builder);
            LogAutoFreshProcess.build(environment, nacosConfigProperties, nacosConfigLoader, builder).process();
        }
    }
        
}

NacosConfigEnvironmentProcessor就做了一件事,往spring容器中添加了NacosConfigApplicationContextInitializer初始化器,后续由它完成从nacos配置中心加载数据的操作。

1.1、重要的NacosConfigEnvironmentProcessor是在哪执行的

这个问题等我们看完下面的代码就有了答案了~

1.2、重要的NacosConfigApplicationContextInitializer是在哪执行的

这个问题等我们看完下面的代码也会有答案了~

2、应用的启动过程

我们从以下的启动类入手。

typescript复制代码@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

2.1、SpringApplication的构造方法做了啥

跟踪上面SpringApplication的run方法,SpringApplication.run方法内部会先创建一个SpringApplication对象,然后再调用该对象的另一个run实例方法。我们先进入SpringApplication的构造方法:

ini复制代码public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        this.bootstrapRegistryInitializers = new ArrayList<>(
                getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
        //从类路径下面的META-INF/spring.factories文件中根据ApplicationContextInitializer配置值来初始化ApplicationContextInitializer实例
        setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
    //从类路径下面的META-INF/spring.factories文件中根据ApplicationListener配置值来初始化ApplicationListener实例
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
    }

其中getSpringFactoriesInstances方法用于从类路径下面的META-INF/spring.factories文件中获取指定配置项对应的类的全路径名列表(多个类的全路径名之间用英文逗号隔开),根据类的全路径名创建相应的对象。

2.1.1、构造方法中的setInitializers方法

setInitializers方法用于设置容器的初始化器对象集合,它的参数来源于getSpringFactoriesInstances(ApplicationContextInitializer.class)的执行结果。getSpringFactories

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值