SpringBoot-⾃动装配原理-简单理解SpringBoot⾃动装配是其核⼼,了解⾃动装配是学习SpringBoot所需要的。
接下来,叙述可以快速串起来的理解
⽬标:IOC、DI
以层级关系展⽰
IOC:将配置类加载到IOC
@SpringBootApplication
@EnableAutoConfiguration
@AutoConfigurationPackage // 会扫描将主配置类所在的包及其⼦包⾥⾯的组件扫描到IOC
@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector // 继承ImportSelector接⼝
String[] selectImports(annotationMetadata)
AutoConfigurationEntry getAutoConfigurationEntry(annotationMetadata)
List<String> getCandidateConfigurations(annotationMetadata, attributes)
List<String> SpringFactoriesLoader.loadFactoryNames(..)
META-INF/spring.factories // ⽂件包含了需要导⼊IOC的类全限定名
key=value
关键地⽅:
@Override
// annotationMetadata 是@import所⽤在的注解.这⾥指定是@EnableAutoConfiguration
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 加载XXConfiguration的元数据信息(包含了某些类被⽣成bean条件)
// 继续跟进这个⽅法调⽤,就会发现加载的是:spring-boot-autoconfigure
// jar包⾥⾯META-INF的spring-autoconfigure-metadata.properties
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); // 获取注解⾥设置的属性,在@SpringBootApplication设置的exclude,
// excludeName属性值,其实就是设置@EnableAutoConfiguration的这两个属性值
AnnotationAttributes attributes = getAttributes(annotationMetadata);
// 从spring-boot-autoconfigure jar包⾥⾯META-INF/spring.factories加载配置类的名称
// 打开这个⽂件发现⾥⾯包含了springboot框架提供的所有配置类
List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
// 去掉重复项
configurations = removeDuplicates(configurations);
// 获取⾃⼰配置不需要⽣成bean的class
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
// 校验被exclude的类是否都是springboot⾃动化配置⾥的类,如果存在抛出异常
checkExcludedClasses(configurations, exclusions);
// 删除被exclude掉的类
// 过滤刷选,满⾜OnClassCondition的类
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
/
/ 返回需要注⼊的bean的类路径
StringArray(configurations);
}
DI:设置默认属性值
@EnableConfigurationProperties({MybatisProperties.class})
MybatisAutoConfiguration
@ConfigurationProperties(prefix = "mybatis") // 这就获取到properties⽂件的值了
MybatisProperties{
private String configLocation;
private String[] mapperLocations;
private String typeAliasesPackage;
/
/...
}
springboot框架是干嘛的
⾃动装配配置类名称:xxxAutoConfiguration.class
属性设置:xxxProperties.class
run(..)
初始化SpringApplication对象实列,
// 初始化SpringApplication对象
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// 加载classpatch⽂件下⾯的配置⽂件
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 判断是否是web运⾏环境
this.webApplicationType = deduceWebApplicationType();
// 使⽤SpringFactoriesLoader在应⽤的classpath中查并加载所有可⽤的ApplicationContextInitializer。 setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
// 使⽤SpringFactoriesLoader在应⽤的classpath中查并加载所有可⽤的ApplicationListener。
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 获得当前执⾏main⽅法的类对象
this.mainApplicationClass = deduceMainApplicationClass();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论