- 下载源码并导入到
IDEA
中- 切换分支:
git checkout -b v5.2.13.RELEASE
- 在IDEA中的Terminal窗口中执行命令:
gradlew :spring-oxm:compileTestJava
- 运行单元测试报错问题
Error:(350, 51) java: 找不到符号变量 CoroutinesUtils
解决方案:导入相应的依赖模块,如下图所示
加载配置文件 —> 读取类定义 —> 类实例化并加载进
IoC
容器
- DefaultListableBeanFactory
Spring注册及加载bean的默认实现
- AliasRegistry
别名注册接口,定义对别名的简单增删等操作
//在启动时,使用`@EnableXXX`与`@Import`注册bean。
// EnableAutoConfiguration 注解,使用 @Import 注解往容器中注册相应的bean
@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationPackages.Registrar.class)
// AutoConfigurationImportSelector 类实现 ImportSelector 接口
//大批量的bean注册:这里主要会从 spring.factories 文件中读取配置好的一些类
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
注解:EnableCaching 默认适用 JDK 动态代理
通过:@Import(CachingConfigurationSelector.class) 将 AutoProxyRegistrar 和 ProxyCachingConfiguration 加载进 IoC 容器当中