本文个人对一个老师的理解,来自https://www.cnblogs.com/hellokuangshen/p/11256189.html
当我们在建立一个springboot的项目时为什么这么容易?
因为我们我们的项目有个爸爸!也就是一个父项目给我们的springboot项目做依赖

这个爸爸帮我们做了什么呢?
1.点开我们的pom.xml文件,找到爸爸

 

 爸爸帮我们管理了很多依赖的版本,也就是爸爸有的版本,我们在使唤这个依赖的时候,不需要写version了,当然,爸爸没有的你要写上。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>//这个web可是别的,写个web只代表这里是个web启动器,到时间springboot会按照web的项目的需要帮我们管理项目。
 </dependency>

springboot-boot-starter:就是spring-boot的场景启动器

这里的 spring-boot-starter-web 帮我们导入了web模块正常运行所依赖的组件;

 

 


@SpringBootApplication这个注解是springboot的主启动类。
点开@SpringBootApplication,我们会发现有@springbootConfiguration,@enableAutoConfiguration,@ComponentScan
1.@ComponentScan, 它对应XML配置中的元素。@ComponentScan的功能就是自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中;之前在spring中用过,拿来扫描你写的bean,
service,controller等组件。
2.@springbootConfiguration,点进去看到它有个@component,表明这是个组件,最终也会被扫描到ioc容器中,进行注册的
3.@enableAutoConfiguration,开启自动配置功能,别忘了这三个注解都是@SpringBootApplication的组成,springboot帮我们配置了一系列的东西,这个是个开关。
  点进去有一个@AutoConfigurationPackage,自动配置包 , 点进去看到一个 @Import({Registrar.class}),Registrar.class是个自动配置类,
  帮我们导入这个web场景所要求的配置,

  你就不用配置了

问题:它咋知道要配置啥?
  它有个方法,SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguation.class,classLoader);
这里的getSpringFactoriesLoaderFactoryClass()方法返回的就是我们最开始看的启动自动导入配置文件的注解类;

 

 进入 SpringFactoriesLoader 查看;发现最终会去读取一个配置文件 : META-INF/Spring.factories 的文件,没错!就是这个玩意儿帮我们存储了我们需要的配置

 

 

 

 

上图是run方法的运行。
1.new一个springApplication对象,初始化,判定是否是web项目,初始化所有启动器,初始化监听器,推断并设置main方法的定义类,找到类加载器加载工厂配置文件,找到全限定类名,进行反射,得到类
2.实例化对象,启动监听器,配置环境参数,创建上下文,有个上下文的异常处理判断,上下文启动。
3.上下文启动完成,执行runner运行器。

 


posted on 2020-02-19 15:48  纯正肉包  阅读(367)  评论(0编辑  收藏  举报