spring和nacos的加载机制

【spring和nacos的加载机制】spring-cloud-context提供引导上下文、加密、刷新范围和环境端点等规范和实现,一起来看它的实现,
SpringFactoriesLoader类是通过类加载器通过getResources()和getSystemResources()查找所有META-INF/spring.factories的文件,这里面的配置一般是springboot自动配置的配置类,进行初始化并缓存。
Environment接口通过继承PropertyResolver包含了profiles和properties两个方面,一个是定义不同配置文件的活动状态,第二个是通过属性名称获取属性值,而使得忽略底层数据来源是否来自属性文件、系统配置、环境变量等等。通常使用的实现类是StandardServletEnvironment。
PropertySource类是一个配置资源类,像常见的NacosPropertySource就是nacos的加载,这里可以看出来NacosPropertySource就是基于MapPropertySource,实现很简单。
PropertySourceLocator类作用是为Environment(环境)定位(可能是远程)属性源的策略。实现类有NacosPropertySourceLocator,nacos是通过configService.getConfig(dataId, group, timeout)下载到本地文件做缓存的,所以其实相当于读取本地文件了。然后在NacosPropertySource层面再包了一层Map(这里不是使用的PropertySourceLoader,而是使用Nacos自己的NacosDataParserHandler来解析内容)并返回NacosPropertySource。
springboot的启动方法,SpringApplication.run(),可以进去看到开始就通过SpringFactoriesLoader加载了实现了ApplicationContextInitializer和ApplicationListener接口的类,实现类有BootstrapApplicationListener(加载bootstrap),ConfigFileApplicationListener(加载application),以及下面两个相关的
NacosConfigBootstrapConfiguration,定义了NacosPropertySourceLocator等Nacos的类
PropertySourceBootstrapConfiguration,初始化时会加载所有的PropertySourceLocator的bean组件,并进行加载,完成了environment.getPropertySources()的初始化。
PropertySourceLoader是加载工具解析类,实现有YamlPropertySourceLoader(yml)、PropertiesPropertySourceLoader(xml),有List> load(String name, Resource resource)方法,根据对应的名称加载出并解析。
----------------记录下spring-boot启动流程-----------------
springboot的启动后会加载所有实现ApplicationContextInitializer和ApplicationListener接口的类,然后springboot其实有个引导上下文(是非web容器)和标准的上下文,具体源码在SpringApplication.prepareEnvironment()方法会调用listeners.environmentPrepared(environment); 事件,这个listeners里有个SpringApplicationRunListener类,它会触发Application.getListeners(),这里的Listeners就是之前加载的所有ApplicationListener类,里面有个BootstrapApplicationListener,会触发onApplicationEvent(ApplicationEnvironmentPreparedEvent event)方法,这里就是会生成一个引导上下文了,并且会加载spring.factories里所有BootstrapConfiguration.class的类,这里就包含上面NacosConfigBootstrapConfiguration类和PropertySourceBootstrapConfiguration类。生成完引导上下文之后会application.addInitializers(new AncestorInitializer(context)),在标准上下文中加一个ApplicationContextInitializer初始化实现类,这里面是把引导上下文作为标准上下文的parent。
创建完引导上下文之后就创建标准上下文了,SpringApplication.createApplicationContext(),之后再就是一系列的生命周期初始化的操作了

    推荐阅读