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(),之后再就是一系列的生命周期初始化的操作了