本文参考来源西安西部开源秦疆老师,特此感谢
首先打开pom.xml,以往在没有使用SpringBoot时,我们在这里进行Maven以来导入等工作,但SpringBoot并不是这样,真正管理所有版本依赖的地方是其父类,SpringBoot帮我们已经配置好了,且进行了版本自动匹配(不会显示版本号),但我们如果需要到导入的包SpringBoot没有帮我们预配置,我们则需要在pom.xml文件中进行配置,并且配置上版本号
springboot-boot-starter:就是spring-boot的场景启动器,这里的spring-boot-starter-web 帮我们导入了web模块正常运行所依赖的组件
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;
创建好的SpringBoot项目,默认会存在包名下存在一个类,例入这里是:
package org.westos.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//@SpringBootApplication标注在一个SpringBoot项目的主程序类上,说明该类是主程序,程序的主入口
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
//将SpringBoot项目启动起来
SpringApplication.run(HelloworldApplication.class, args);
}
}
看似简单的主程序,其背后并不简单
@SpringBootApplication:此注解标注在SpringBoot应用的某个类上,说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用,进入这个注解:
进入@SpringBootApplication注解后,我们首先来看@SpringBootConfiguration注解
@SpringBootConfiguration:标注在某个类上 , 表示这是一个SpringBoot的配置类;我们继续进去这个注解查看:
重点是@Configuration注解,配置类上来标注这个注解我们继续点进去,发现配置类也是容器中的一个组件,@Component即表示组件的意思
此注解用于开启SpringBoot自动配置功能,以前我们需要配置的东西,SpringBoot可以自动帮我们配置 ; @EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效,我们点进去查看这个注解:
首先来看**@AutoConfigurationPackage**,该注解能实现自动配置包的功能,继续点进去:
我们来看**@Import(AutoConfigurationPackages.Registrar.class)**这个注解
@import :Spring底层注解@import , 给容器中导入一个组件 ,导入的组件由 {Registrar.class} 将主配置类 【即@SpringBootApplication标注的类】的所在包及包下面所有子包里面的所有组件扫描到Spring容器
然后回到@EnableAutoConfiguration类看**@Import(AutoConfigurationImportSelector.class)**注解,AutoConfigurationImportSelector 为导入哪些组件的选择器 ,**它将所有需要导入的组件以全类名的方式返回 , 这些组件就会被添加到容器中 ;**它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
我们在AutoConfigurationImportSelector里找到getCandidateConfigurations及其方法,可以看到该方法返回自动配置类名,即配置文件信息:
我们再进入 SpringFactoriesLoader 查看
该类的方法会通过反射读取一个配置文件:META-INF/Spring.factories
我们打开spring.factories的配置文件 , 看到了很多自动配置的文件;这就是自动配置根源所在
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作,以前我们需要自己配置的东西,自动配置类帮我们做了
真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行
该类在程序中主要的四个功能: