当我们需要使用各个三方依赖的时候,就把三方依赖引入进来,然后spring-boot启动的时候,通过jdk的spi机制,加载spring-boot-autoconfigurn和三方依赖中的spring.dacfories,然后找到三方依赖的相关配置,然后注入到spring IOC容器中进行使用
SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar
1:点到@SpringBootApplication注解
这个注解是一个复合注解,里面还包含了其他的注解
@SpringBootConfiguration:这个注解的底层是一个@Configuration注解,意思被@Configuration注解修饰的类是一个IOC容器,支持JavaConfig的方式来进行配置; @ComponentScan:这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中; @EnableAutoConfiguration:这个注解表明启动自动装配,里面包含连个比较重要的注解@AutoConfigurationPackage和@import。
2:点到@EnableAutoConfiguration 注解里面
@AutoConfigurationPackage: 这个注解的意思和@ComponentScan的意思差不多是一样的,都是将主配置类所在的包及其子包里面的组件扫描到IOC容器中, 但是区别的点在于,@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解,但是@AutoConfigurationPackage扫描 @Enitity、@MapperScan等第三方依赖的注解 @import(AutoConfigurationimportSelector.class):是自动装配的核心注解,AutoConfigurationimportSelector.class中有个process方法
3:进入AutoConfigurationimportSelector
protected AutoConfigurationimportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationmetadata
autoConfigurationmetadata, Annotationmetadata annotationmetadata) {
if (!this.isEnabled(annotationmetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationmetadata);
//获取自动配置的类名集合
List configurations = this.getCandidateConfigurations(annotationmetadata, attributes);
//将自动配置的类名去重
configurations = this.removeDuplicates(configurations);
//获取需要去除的列名
Set exclusions = this.getExclusions(annotationmetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
//将自动配置类名集合里的无用类去除
configurations.removeAll(exclusions);
//过滤,autoConfigurationmetadata为过滤条件
configurations = this.filter(configurations, autoConfigurationmetadata);
//自动装配导入事件
this.fireAutoConfigurationimportEvents(configurations, exclusions);
return new AutoConfigurationimportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}



