携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
springboot中如何装配nacos
首先看springboot的spi机制
在nacos-config-spring-boot-autoconfigure jar中META-INF/spring.factories文件 (springboot2.7后不再用spring.factories)
启动类在运行静态run方法的时候,是先创建一个SpringApplication对象,再运行对象的run方法,工厂初始配置在构造函数中完成,run方法定义运行总体流程
初始化配置
springboot启动应用程序之前,会创建一些初始化对象和监听器
这个操作在构造方法中完成,根据配置文件,创建ApplicationContextInitializer.class,ApplicationListener.class两个接口的实现类
这里加载的初始化器是springboot自带初始化器,从从 META-INF/spring.factories 配置文件中加载的,那么这个文件在哪呢?自带有2个,分别在源码的jar包的 spring-boot-autoconfigure 项目 和 spring-boot 项目里面各有一个
spring.factories文件里面,看到开头是 org.springframework.context.ApplicationContextInitializer 接口就是初始化器了 ,
获取并启用监听器
这一步 通过监听器来实现初始化的的基本操作,这一步做了2件事情
- 创建所有 Spring 运行监听器并发布应用启动事件
- 启用监听器
将maven和系统的环境变量都加载进来
创建应用程序的上下文
实例化应用程序的上下文, 调用 createApplicationContext() 方法,这里就是用反射创建对象,没什么好说的;
实例化异常报告器
异常报告器是用来捕捉全局异常使用的,当springboot应用程序在发生异常时,异常报告器会将其捕捉并做相应处理,在spring.factories 文件里配置了默认的异常报告器,
准备上下文环境
实例化单例的beanName生成器
执行初始化方法
初始化方法有哪些呢?还记得第3步里面加载的初始化器嘛?其实是执行加载出来的所有初始化器,实现了ApplicationContextInitializer 接口的类
读取本地配置
不存在则去远程读nacos服务器的配置
调用http请求
解析配置