springboot自动导入原理
springboot能根据场景自动导入jar包的原理。
- 在pom.xml文件中会先导入springboot启动器父项目,其作用如图
从上面的项目依赖图中可以看出,最终spring-boot-dependencies给当前spring boot项目:
1. 对一些依赖管理
2. 默认插件配置
3. 对spring boot的依赖进行版本管理
- spring boot将不同场景都剥离出来,做成一个个场景启动器,需要使用哪个场景就导入哪个场景的启动器依赖。
所以真正导入当前场景相关jar包的是springboot的场景启动器,如
综上:spring boot启动器父项目 管理依赖版本,场景启动器 导入对应场景所需依赖。(不在启动器父项目版本管理范围内的依赖还是要自己去设置版本)
springboot自动加载组件原理
当启动springboot主程序后,之所以能够正常访问程序及程序能正常处理请求we不用像通常Spring项目要配置servlet等等这些组件,是因为在启动springboot主程序后,springboot能够自动去配置这些组件。
- @Import(AutoConfigurationPackages.Registrar.class) 自动配置package
由上图可知,自动配置包最终会将主程序所在包路径及子包路径下的所有组件都扫描到容器中,等同于spring的ioc配置文件中<context:component-scan base-package="com.xxx" />
- @Import(AutoConfigurationImportSelector.class) 自动配置导入选择器,要导入哪些自动配置
在 SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())中:
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
// EnableAutoConfiguration.class完整类名为org.springframework.boot.autoconfigure.EnableAutoConfiguration
loadFactoryNames方法的实现:
spring.factories文件:
里面都是一些自动配置类(.xxxAutoConfiguration),再看下这些自动配置类
上图中开启配置属性需要 ServerProperties.class,而此java类含有@ConfigurationProperties表名此配置类是利用配置文件中的配置来给属性赋值的,这也就是为什么我们能在全局配置文件中使用server.port等参数来设置属性的原因,因为这些参数是配置类的属性。
加载这个自动配置类后,自动配置类中被@Bean注解标注的方法返回的类就会被加入容器中成为组件。
综上:@EnableAutoConfiguration会将主程序所在路径及其子路径下的所有组件注册加入容器中,同时将spring.factories文件中对应的自动配置类加载,加载后将自动配置类中的bean添加到容器。
在spring-boot-autoconfigure包下,会有各种各样的xxxAutoConfiguration自动配置类,也会有xxxProperties类来封装配置文件中的内容,供给自动配置类使用。所以当前配置类能修改些什么配置,可以参考当前自动配置类所使用的xxxProperties类。
打印查看成功导入哪些自动配置类:在全局配置文件中添加 debug=true 。