本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。
![ec505c3a9f63a6cb54e72266d483f514.png](https://i-blog.csdnimg.cn/blog_migrate/b88840b3f35891fbfb21ba32ceb45bdb.jpeg)
上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。
启动:
每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解,以及@ImportResource注解(if need),@SpringBootApplication包括三个注解,功能如下:@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置
@SpringBootConfiguration(内部为@Configuration):被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境
@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下
![2d0df7275dab296c7cefee31b3064b33.png](https://i-blog.csdnimg.cn/blog_migrate/65cbe41a842f941a1ba3a5b8839d2915.jpeg)
SpringBoot启动类
首先进入run方法
![94e85e05bbff006d60e27fd0466a7bc6.png](https://i-blog.csdnimg.cn/blog_migrate/df9fa6d11e6bb99952c7f47176d9d1f3.jpeg)
run方法中去创建了一个SpringApplication实例,在该构造方法内,我们可以发现其调用了一个初始化的initialize方法
![26b62de0251599f089be607654953bcd.png](https://i-blog.csdnimg.cn/blog_migrate/62c3fcd432f9cb6422a4e9990598ff32.jpeg)