目录
一、SpringBoot优势
jar包依赖引入区别:
SpringBoot可以简单理解为是在Spring框架的基础上,做了升级。
在使用Spring创建工程时,需要引入一系列的jar包,但是使用SpringBoot创建工程的时候,只需要引入**-start的jar包即可;
xml配置区别:
在使用Spring创建工程时需要配置xml文件;
使用SpringBoot则可以通过JavaConfig来达到之前的效果:第三方插件,如aop,mvc都是使用@Configuration+@ConfigurationProperties注解来配置Spring的xml中配置<bean>标签的操作的。
二、SpringBoot实现组件自动装配的原理
在SpringBoot程序的入口类上有个@SpringBootApplication注解。点击该注解,能看到这个注解上又标注了一堆注解,其中关键是@ComponentScan、@EnableAutoConfiguration
- @ComponentScan:
- 该注解默认会扫描标注该注解类所在的包下所有的配置类
- @EnableAutoConfiguration:
- 该注解上有个@Import注解,导入了AutoConfigurationImportSelector.class
-
@Import(AutoConfigurationImportSelector.class)
- 在AutoConfigurationImportSelector类中的SelectImport方法,通过
把 spring-boot-autoconfigure.jar/META-INF/spring.factories返回,将其注入到了IOC容器中
- 以上注解关系图如下:
三、组件自动装配的代码概览:
实现组件自动装配的最外层的源代码如以下部分,大概分为三步:
- 该方法中,读取sprinbg.factories文件中key值=org.springframework.boot.autoconfigure.EnableAutoConfiguration下的所有字符串
- 去重
- 去重去除exclusion需要去除的组件
- 去除未添加依赖的组件<是从spring-autoconfigure-metadata.properties文件中读取的>
- 注册到容器
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 该方法中,读取sprinbg.factories文件中key值=org.springframework.boot.autoconfigure.EnableAutoConfiguration下的所有字符串
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 去重
configurations = this.removeDuplicates(configurations);
// 去除exclusion
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
// 去除未添加依赖的组件<是从spring-autoconfigure-metadata.properties文件中读取的>
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
// 注册到容器
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
四、自动装配组件时属性初始化原理
- 每个xxxAutoConfiguration文件都是通过@Conditionxxx、@EnableConfigurationProperties、@ConfigurationProperties,以及xxxProperties.class来设置默认值的。
- @Conditionxxx:一种校验的注解:
- @ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
- @ConditionalOnClass : classpath中存在该类时起效
- @EnableConfigurationProperties(xxxProperties.class):
- 提供@ConfigurationProperies注解的支持
- 进入xxxProperties.properties会看到@ConfigurationProperties:
- 如:
@ConfigurationProperties(prefix = "spring.kafka") public class KafkaProperties {
- 其中prefix=spring.kafka“”则表示,会去properties,或者yml文件中加载相关值
- 如:
- @Conditionxxx:一种校验的注解: