Skip to content

Commit

Permalink
03.03 ConfigurationClassPostProcessor 解析配置类.
Browse files Browse the repository at this point in the history
  • Loading branch information
linweiwang committed Apr 25, 2024
1 parent d8afaac commit 64b6977
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ public void parse(Set<BeanDefinitionHolder> configCandidates) {
for (BeanDefinitionHolder holder : configCandidates) {
BeanDefinition bd = holder.getBeanDefinition();
try {
// 解析
if (bd instanceof AnnotatedBeanDefinition) {
parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());
}
Expand Down Expand Up @@ -246,6 +247,7 @@ protected void processConfigurationClass(ConfigurationClass configClass, Predica
// Recursively process the configuration class and its superclass hierarchy.
SourceClass sourceClass = asSourceClass(configClass, filter);
do {
// 真正去解析
sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter);
}
while (sourceClass != null);
Expand All @@ -266,11 +268,13 @@ protected final SourceClass doProcessConfigurationClass(
ConfigurationClass configClass, SourceClass sourceClass, Predicate<String> filter)
throws IOException {

// 解析 @Component
if (configClass.getMetadata().isAnnotated(Component.class.getName())) {
// Recursively process any member (nested) classes first
processMemberClasses(configClass, sourceClass, filter);
}

// 解析 @PropertySource
// Process any @PropertySource annotations
for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), PropertySources.class,
Expand All @@ -284,6 +288,7 @@ protected final SourceClass doProcessConfigurationClass(
}
}

// 解析 @ComponentScan
// Process any @ComponentScan annotations
Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
Expand All @@ -306,9 +311,11 @@ protected final SourceClass doProcessConfigurationClass(
}
}

// 解析 @Import
// Process any @Import annotations
processImports(configClass, sourceClass, getImports(sourceClass), filter, true);

// 解析 @ImportResource
// Process any @ImportResource annotations
AnnotationAttributes importResource =
AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);
Expand All @@ -321,6 +328,7 @@ protected final SourceClass doProcessConfigurationClass(
}
}

// 解析 @ImportResource
// Process individual @Bean methods
Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
for (MethodMetadata methodMetadata : beanMethods) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ public void setApplicationStartup(ApplicationStartup applicationStartup) {
}

/**
* 拿到所有配置类中的所有 Bean 定义信息
* Derive further bean definitions from the configuration classes in the registry.
*/
@Override
Expand All @@ -244,6 +245,7 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
}
this.registriesPostProcessed.add(registryId);

// 进行后置增强处理
processConfigBeanDefinitions(registry);
}

Expand Down Expand Up @@ -277,6 +279,7 @@ public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
String[] candidateNames = registry.getBeanDefinitionNames();

// 遍历所有的候选 BeanName
for (String beanName : candidateNames) {
BeanDefinition beanDef = registry.getBeanDefinition(beanName);
if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
Expand All @@ -285,6 +288,7 @@ public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
}
}
else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
// 将配置类加入候选集和中
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
}
}
Expand All @@ -294,18 +298,22 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
return;
}

// 排序
// Sort by previously determined @Order value, if applicable
configCandidates.sort((bd1, bd2) -> {
int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
return Integer.compare(i1, i2);
});

// 单实例的注册中心
// Detect any custom bean name generation strategy supplied through the enclosing application context
SingletonBeanRegistry sbr = null;
if (registry instanceof SingletonBeanRegistry) {
sbr = (SingletonBeanRegistry) registry;
if (!this.localBeanNameGeneratorSet) {
// 获取 CONFIGURATION_BEAN_NAME_GENERATOR 的组件
// "org.springframework.context.annotation.internalConfigurationBeanNameGenerator"
BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(
AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR);
if (generator != null) {
Expand All @@ -319,6 +327,7 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
this.environment = new StandardEnvironment();
}

// 使用 ConfigurationClassParser 解析配置类,即 @Configuration 注解的类
// Parse each @Configuration class
ConfigurationClassParser parser = new ConfigurationClassParser(
this.metadataReaderFactory, this.problemReporter, this.environment,
Expand All @@ -328,6 +337,7 @@ else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.
Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
do {
StartupStep processConfig = this.applicationStartup.start("spring.context.config-classes.parse");
// 解析配置类
parser.parse(candidates);
parser.validate();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ public static void invokeBeanFactoryPostProcessors(
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

// 首先:调用实现 PriorityOrdered 的BeanDefinitionRegistryPostProcessors
// 此处会获取底层 org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
Expand Down

0 comments on commit 64b6977

Please sign in to comment.