第七步:invokeBeanFactoryPostProcessors(beanFactory)
invokeBeanFactoryPostProcessors(beanFactory)调用链
main:9, AnnotationConfigApplication (com.tbryant.springtest)
refresh:535, AbstractApplicationContext (org.springframework.context.support)
本文主角invokeBeanFactoryPostProcessors方法
invokeBeanFactoryPostProcessors:717, AbstractApplicationContext (org.springframework.context.support)
invokeBeanFactoryPostProcessors:118, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanDefinitionRegistryPostProcessors:299, PostProcessorRegistrationDelegate (org.springframework.context.support)
(重要)PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
if (beanFactory instanceof BeanDefinitionRegistry) {
// 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
registryProcessor.postProcessBeanDefinitionRegistry(registry);
}
}// end
// 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
}
}
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// end
// 执行实现Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
}
}
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// end
// 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
boolean reiterate = true;
while (reiterate) {
reiterate = false;
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
reiterate = true;
}
}
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
}// end
// 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
// 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanFactoryPostProcessors的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
// 执行实现PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 执行实现Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
// 执行其他所有BeanFactoryPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
}
- 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
- 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
- 执行实现Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
- 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
- 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
- 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanFactoryPostProcessors的postProcessBeanFactory方法
- 执行实现PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
- 执行实现Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
- 执行其他所有BeanFactoryPostProcessor的postProcessBeanFactory方法
debug源码
第二步执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry方法
第五步执行ConfigurationClassPostProcessor.postProcessBeanFactory方法
第九步执行EventListenerMethodProcessor.postProcessBeanFactory方法
执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry方法
postProcessBeanDefinitionRegistry:238, ConfigurationClassPostProcessor (org.springframework.context.annotation)
processConfigBeanDefinitions:328, ConfigurationClassPostProcessor (org.springframework.context.annotation)
ConfigurationClassPostProcessor.processConfigBeanDefinitions
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
// 遍历BeanDefinitionMap判断是否有配置类,没有直接return start
for (String beanName : candidateNames) {
if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
}
}
if (configCandidates.isEmpty()) {
return;
}// end
// 实例化解析器
ConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
// 解析配置类,处理annotation风格注册的Bean
parser.parse(candidates);
// 注册其他风格的Bean
this.reader.loadBeanDefinitions(configClasses);
}
- 遍历BeanDefinitionMap判断是否有配置类,没有直接return
- 解析配置类,处理annotation风格注册的Bean
- 注册其他风格的Bean
解析配置类,处理annotation风格注册的Bean
parse:168, ConfigurationClassParser (org.springframework.context.annotation)
parse:200, ConfigurationClassParser (org.springframework.context.annotation)
processConfigurationClass:243, ConfigurationClassParser (org.springframework.context.annotation)
doProcessConfigurationClass:288, ConfigurationClassParser (org.springframework.context.annotation)
parse:131, ComponentScanAnnotationParser (org.springframework.context.annotation)
doScan:276, ClassPathBeanDefinitionScanner (org.springframework.context.annotation)
ClassPathBeanDefinitionScanner.doScan
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
for (String basePackage : basePackages) {
// 扫描、解析、生成BeanDefinition
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
// 验证
if (checkCandidate(beanName, candidate)) {
// 注册到BeanDefinitionMap
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
}
这个方法是annotation风格注册Bean的核心,包含扫描、解析、验证、注册等步骤。
ClassPathScanningCandidateComponentProvider.findCandidateComponents
findCandidateComponents:315, ClassPathScanningCandidateComponentProvider (org.springframework.context.annotation)
scanCandidateComponents:416, ClassPathScanningCandidateComponentProvider (org.springframework.context.annotation)
ClassPathScanningCandidateComponentProvider.scanCandidateComponents
private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
// 拼接扫描规则
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + '/' + this.resourcePattern;
// 拿到所有.class文件
Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
for (Resource resource : resources) {
// 解析.class文件
MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
// 判断是否加了@Component注解
if (isCandidateComponent(metadataReader)) {
// annotation风格注册的Bean会解析成ScannedGenericBeanDefinition
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
}
}
}
处理其他风格注册的Bean
回到ConfigurationClassPostProcessor.processConfigBeanDefinitions
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
// 以上分析的是这个方法
parser.parse(candidates);
// 下面分析这个方法
this.reader.loadBeanDefinitions(configClasses);
}
ConfigurationClassBeanDefinitionReader.loadBeanDefinitions
loadBeanDefinitions:117, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitionsForConfigurationClass:141, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass
private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass, TrackedConditionEvaluator trackedConditionEvaluator) {
// 遍历@Bean注解的方法,注册BeanDefinition
for (BeanMethod beanMethod : configClass.getBeanMethods()) {
loadBeanDefinitionsForBeanMethod(beanMethod);
}
// 解析@ImportResource,解析XML
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
}
- 遍历@Bean注解的方法,处理java config风格注册的Bean
- 解析@ImportResource,处理XML风格注册的Bean
处理java config风格注册的Bean
ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod
private void loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod) {
// java config风格注册的Bean会解析成ConfigurationClassBeanDefinition
ConfigurationClassBeanDefinition beanDef = new ConfigurationClassBeanDefinition(configClass, metadata);
// 注册到BeanDefinitionMap
this.registry.registerBeanDefinition(beanName, beanDefToRegister);
}
这个方法是java config风格注册Bean的核心,包含解析、验证、注册等步骤。
处理XML风格注册的Bean
回到ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromImportedResources
loadBeanDefinitionsFromImportedResources:326, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
forEach:684, LinkedHashMap (java.util)
accept:-1, 911312317 (org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$$Lambda
loadBeanDefinitionsFromImportedResources$0:359, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitions:195, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:224, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:188, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:305, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)
loadBeanDefinitions:337, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)
doLoadBeanDefinitions:395, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)
XmlBeanDefinitionReader.doLoadBeanDefinitions
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
throws BeanDefinitionStoreException {
// 加载XML文件
Document doc = doLoadDocument(inputSource, resource);
// 解析、验证、注册BeanDefinition
int count = registerBeanDefinitions(doc, resource);
}
XML风格注册的Bean会解析成GenericBeanDefinition
执行ConfigurationClassPostProcessor.postProcessBeanFactory方法
// TODO
执行EventListenerMethodProcessor.postProcessBeanFactory方法
// TODO