现在比较流行的SpringBoot 最核心的注解就是 @SpringBootApplication
他的底层主要分为三个注解 : @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootConfiguration
干什么用的 : 他就是将加这个注解的类作为配置类 将这个类交给 spring 的 IOC 容器中进行管理
怎么用 : 直接在这个类上面在上这个注解就行
@ComponentScan
怎么用 : 直接在类上边加上这个注解即可 干什么用的 : 用于定义 Spring 的扫描的路径
如果加里面的参数(就是扫描的包) 那么 Spring 会默认扫描当前类所在的包以及这个包下的所有子包里带有 @Component @Service @Controller 等注解的类
@EnableAutoConfiguration
里面有两个注解 @AutoConfigurationPackage 和 @Import 他们两个是 SpringBoot 自动配置的核心
@AutoConfigurationPackage
AutoConfigurationPackage注解的作用是将添加该注解的类所在的package作为自动配置package进行管理 可以通过 AutoConfigurationPackage 工具类获取自动配置 package 列表 当通过注解 @SpringBootApplication 标注启动类时 已经为启动类添加 @AutoConfigurationPackage 注解了 就是当 SpringBoot项目启动时 默认会将启动类所在的 package 作为自动配置的 package
Registrar (AutoConfigurationPackage 内部类)
这个类主要就是读取到最外层的 @SpringBootApplication 注解中配置的扫描路径 (不配置的话默认就是当前包下的) 然后把扫描路径下面的类都放在数组中
AutoConfigurationPackage 的 SPI机制
AutoConfigurationPackage 是通过 SpringFactoriesLoader 来读取配置文件 spring.factories 中的配置文件 这种方式叫做 一种 SPI 思想
@Import
如果我们这个类加上注解也没被 Spring 扫描到 也就是说明无法注解注入这个类 这个时候呢我们就可以在这个类上边加上这个(@Import)注解 这个时候就可以注入进来这个类了
这个注解其实就是为了去导入 AutoConfigurationImportSelector 类 SPI (Service Provider Interface) 就是接口服务的提供者 就是我们在面向接口编程 而不是具体的实现来编程 这样我们一旦需要切换到当前接口的其他实现就无序修改代码了 在 Java 中数据库就使用到了 SPI 技术 每次我们只需要引入数据库驱动就能被加载出来的原因就是我们使用了 SPI 技术
AutoConfigurationImportSelector.Class
这个类里进去就会看到一个方法 这个方法大概的功能就是看有没有数据 没有就说明没导入 则直接返回一个空数组 有的话及调用 getAutoConfigurationEntry() 方法
getAutoConfigurationEntry()方法
这个方法主要就是通过调用 getCandidateConfigurations() 方法来获取候选的 Bean 并将他们存成集合 经过去重 校验等操作之后进行封装 封装成 AutoConfigurationEntry 对象