SpringBoot框架之所以如此好用,源于其提供了两个非常重要的功能:
起步依赖和自动配置。
1.起步依赖
起步依赖一般有两种:
一种是官方提供的起步依赖:类似于 spring-boot-xxx 这种
另一种是非官方起步依赖:一般以自己公司名打头
如何判断是不是起步依赖:一般是有starter后缀
开发一个基于传统Spring项目繁琐复杂,需要手动导入大量所需依赖,还面临版本不兼容问题,导致报错。
而Spring起步依赖不仅自动导入所需要的相关间接依赖,还十!分!贴!心!配好版本,避免依赖冲突。
Spring会自动检测当前的依赖是否需要别的依赖的支持才能运行。
Maven依赖传递特性:可以将间接依赖引入直接依赖
起步依赖的本质:就是一个jar包,在内部已经封装了当前环境需要的依赖们,并且解决了版本冲突问题。原理上就是运用了Maven的依赖传递特性。
2.自动配置
在SpringBoot启动时会加载主配置类,主要是引导类的一个核心注解:@SpringBootApplication
让我们用脚点进去一探究竟,
发现@SpringBootApplication 其实是一个复合注解。
接下来就逐一介绍:
@SpringBootConfiguration
底层就是@Configuration注解,表示当前引导类也是一个配置类,配置类本身也会被注入IOC容器中,并且配置类一定被启动类扫描到。
@Configuration标注了一个配置类,并且具有组件扫描功能, 会扫描带@Bean注解的方法, 并将其加入到spring容器中.
一个类如果添加了@Configuration注解,那么这个类就是一个配置类。@Configuration底层还是@Component。
@ComponentScan
表示当前引导类所在的包会被进行组件扫描,只有被扫到了才能加入spring容器。给哪个类添加该注解,那么该类所在的包就是默认的扫描路径。
@EnableAutoConfiguration
是它,就是它——实现了自动配置。
给我点进去
AutoConfigurationPackage注解的作用:
是将添加该注解的类所在的package作为自动配置package进行管理。
也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package。然后使用@Import注解将其注入到IOC容器,这样可以在容器中拿到该路径。
点进去AutoConfigurationImportSelector
其中 Registrar 类的作用:
是将启动类所在包下的所有子包的组件扫描注入到spring容器中。
@Import(AutoConfigurationImportSelector.class)
使用Import自动导入所有符合自动配置条件的Bean定义并加载到IOC容器。
这个类会自动去执行会自动执行 SelectImports方法。SelectImports方法最终会调用SpringFactoriesLoader的LoadFactoryNames方法。而这个方法会加载 AutoConfiguration 包下的META-INF目录spring.factories文件中的所有的数据,将其所有的值封装成一个字符串数组。
最终Spring容器会根据起步依赖以及@Conditional相关注解进行过滤,将满足条件的字符串数组内部封装的全类名通过反射的方式创建对象并注入到容器中。