博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码 10 IOC refresh方法5
阅读量:37194 次
发布时间:2020-08-01

本文共 9250 字,大约阅读时间需要 30 分钟。

本文章基于 Spring 5.3.15

Spring IOC 的核心是 AbstractApplicationContextrefresh 方法。

其中一共有 13 个主要方法,这里分析第 5 个:invokeBeanFactoryPostProcessors

1 AbstractApplicationContext

1-1 执行 Bean 工厂的增强器

invokeBeanFactoryPostProcessors(beanFactory)
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {    // 获取 Bean工厂 增强器    // 执行 Bean工厂 增强器    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());    if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {      	beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));      	beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));    }}

1-2 获取 Bean工厂 增强器

getBeanFactoryPostProcessors()
/** * Bean 工厂增强器集合 */private final List
beanFactoryPostProcessors = new ArrayList<>();public List
getBeanFactoryPostProcessors() { return this.beanFactoryPostProcessors;}

1-2 执行 Bean工厂 增强器

invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())

2 PostProcessorRegistrationDelegate

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List
beanFactoryPostProcessors) { Set
processedBeans = new HashSet<>(); // 对 BeanDefinitionRegistry 类型的处理 if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List
regularPostProcessors = new ArrayList<>(); List
registryProcessors = new ArrayList<>(); // 硬编码注册的后处理器 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; // 有自定义的方法,需要先调用 registryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else { // 记录常规 BeanFactoryPostProcessor regularPostProcessors.add(postProcessor); } } List
currentRegistryProcessors = new ArrayList<>(); // 首先,调用实现 PriorityOrdered 的 BeanDefinitionRegistryPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } // 排序增强器 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); // 调用 Bean 定义注册表增强器 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // 其次,调用实现 Ordered 的 BeanDefinitionRegistryPostProcessors postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } // 排序增强器 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); // 调用 Bean 定义注册表增强器 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // 最后, 调用所有其他 BeanDefinitionRegistryPostProcessor 直到不再出现 boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } // 排序增强器 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); // 调用 Bean 定义注册表增强器 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); } // 调用 Bean 工厂增强器 invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { // 调用向上下文实例注册的工厂处理器 invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } // 配置中读取的 BeanFactoryPostProcessor 的处理 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // 将实现 PriorityOrdered、Ordered 和其余部分的 BeanFactoryPostProcessor 分开 List
priorityOrderedPostProcessors = new ArrayList<>(); List
orderedPostProcessorNames = new ArrayList<>(); List
nonOrderedPostProcessorNames = new ArrayList<>(); // 对后处理器进行分类 for (String ppName : postProcessorNames) { if (processedBeans.contains(ppName)) { // 已经处理过则跳过 } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // 首先,调用实现 PriorityOrdered 的 BeanFactoryPostProcessor sortPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // 接下来,调用实现 Ordered 的 BeanFactoryPostProcessors List
orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // 最后,调用所有其他 BeanFactoryPostProcessor List
nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); // 清除元数据缓存,清除缓存的合并 bean 定义,因为后处理器可能已经修改了原始元数据,例如替换值中的占位符 beanFactory.clearMetadataCache();}

2-1 排序增强器

sortPostProcessors(currentRegistryProcessors, beanFactory)
private static void sortPostProcessors(List
postProcessors, ConfigurableListableBeanFactory beanFactory) { if (postProcessors.size() <= 1) { return; } Comparator comparatorToUse = null; if (beanFactory instanceof DefaultListableBeanFactory) { comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator(); } if (comparatorToUse == null) { comparatorToUse = OrderComparator.INSTANCE; } postProcessors.sort(comparatorToUse);}

2-1 调用 Bean 定义注册表增强器

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup())
private static void invokeBeanDefinitionRegistryPostProcessors( Collection
postProcessors, BeanDefinitionRegistry registry, ApplicationStartup applicationStartup) { for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) { StartupStep postProcessBeanDefRegistry = applicationStartup.start("spring.context.beandef-registry.post-process").tag("postProcessor", postProcessor::toString); postProcessor.postProcessBeanDefinitionRegistry(registry); postProcessBeanDefRegistry.end(); }}

2-1 清除元数据缓存

beanFactory.clearMetadataCache()

3 DefaultListableBeanFactory

public void clearMetadataCache() {   // 调用父类方法   super.clearMetadataCache();   this.mergedBeanDefinitionHolders.clear();   // 按类型清除缓存   clearByTypeCache();}

3-1 调用父类方法

super.clearMetadataCache()

4 AbstractBeanFactory

public void clearMetadataCache() {   this.mergedBeanDefinitions.forEach((beanName, bd) -> {      // 判断 Bean 是否有资格进行元数据缓存      if (!isBeanEligibleForMetadataCaching(beanName)) {         bd.stale = true;      }   });}

4-1 判断 Bean 是否有资格进行元数据缓存

private final Set
alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));protected boolean isBeanEligibleForMetadataCaching(String beanName) { return this.alreadyCreated.contains(beanName);}

3 DefaultListableBeanFactory

3-1 按类型清除缓存

clearByTypeCache()
private void clearByTypeCache() {   this.allBeanNamesByType.clear();   this.singletonBeanNamesByType.clear();}

转载地址:http://mupwwy.baihongyu.com/

你可能感兴趣的文章
《巴菲特的估值逻辑》书中的精髓:在投资过程中不断总结经验,不断提升投资能力,不断探索、加深对好公司的理解,成就了巴菲特的投资神话。
查看>>
《股市稳赚》书中的精髓:用简单的神奇公式进行股票投资,获得稳定而持久的收益。
查看>>
《曾国藩的经济课》书中的精髓:我们如何像曾国藩一样,在遇到道德和环境冲突时,既能保持自己的道德,又能调动资源,帮助自己成事。
查看>>
《富人的逻辑》书中的精髓:为什么暴富起来的人会在短期内失去财富,我们又该如何去创造财富和持续拥有财富。
查看>>
作文提升~老师整理的优美比喻句太实用
查看>>
作文提升~老师整理的优美拟人句太实用
查看>>
作文提升~老师整理的优美排比句太实用
查看>>
作文提升~老师整理的夸张句,太实用了,赶快收藏
查看>>
作文提升~写景常用的拟人句,很经典
查看>>
小学教师资格考试科目一思维导图-教育观、教师观和学生观
查看>>
小学教师资格考试科目一思维导图-职业道德
查看>>
小学教师资格考试科目一思维导图-逻辑思维能力、阅读理解、写作能力
查看>>
什么是劳动型创业者?什么叫做社会平均利润?
查看>>
什么是中奖型创业者?
查看>>
什么是套利型创业者?
查看>>
什么是取势型创业者?
查看>>
为什么煲鸡汤给病人喝?
查看>>
带团队很简单,管理就是十六字!(管理者必看)
查看>>
写作技巧~100段作文排比句(61-80段),考试一定用得上,赶紧收藏!
查看>>
判别式模型和生成式模型
查看>>