SpringBoot可以说是Spring和SpringMVC的进一步封装,以及一些其他东西的封装,底层依旧是Spring和SpringMVC。
研究它的源码就是要弄懂为什么一个注解@SpringBootApplication
和SpringApplication.run(Springboot01HelloworldApplication.class, args);
就可以把spring容器,以及Tomcat以及springmvc都整合并启起来。
两个部分:
1、依赖环节:SpringBoot抽取各种Spring-Boot-Starter-xxx场景启动器,给我们导入了很多依赖(spring、springMVC、embedTomcat嵌入式Tomcat)
2、运行原理:
@SpringBootApplication
拆解
@SpringBootConfiguration //里边是@Configuration表示是一个配置类,就会去分析注解
|--@Configuration
@EnableAutoConfiguration
|--@AutoConfigurationPackage
|--@Import({Registrar.class}) //导入组件
|--@Import({AutoConfigurationImportSelector.class}) //导入组件
@ComponentScan
如上可知核心就是@EnableAutoConfiguration
导入的两个组件
所以紧接着分析这两个组件到底导了啥
1、第一处
@Import({Registrar.class})
AutoConfigurationPackage //指定我们以后要扫描那些包下的组件
2、第二处
@Import({AutoConfigurationImportSelector.class})
SpringFactoriesLoader.loadFactoryNames(); 去类路径下找 MATE-INF/spring.factories文件
SPI机制;
spring.factories文件下即可找到EnableAutoConfiguration下的所有配置类 xxxAutoConfiguration(130个左右)这些就是默认的全场景配置类(配置类功能只有一个:给容器中放组件【@bean】,接下来就是spring容器接管了)
加载了130个配置类后,我们不可能都需要用,所以会进行排除和过滤,以及每个配置类上都有@ConditionalOn注解来判断是否生效
接着将剩下的我们所需要的配置类放到entries集合中
SpringBoot导入相关组件后,spring启动容器、springMVC启动容器、嵌入式Tomcat启动
可见SpringBoot的强大之处在于自动配置,里边各种判断,各种导入。