postProcessBeanFactory() 方法留给子类去实现。

invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查看)

容器refresh总览:

     synchronized (this.startupShutdownMonitor) {// 设置环境,校验参数。prepareRefresh();// 创建BeanFactory(DefaultListableBeanFactor),加载bean定义信息。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 对BeanFactory设置  prepareBeanFactory(beanFactory);try {// 留给子类去实现,完成对beanFactory的自定义处理postProcessBeanFactory(beanFactory);// 调用beanFactory的后置处理器invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}
 protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {// 调用bean工厂的后置处理器,getBeanFactoryPostProcessors()获取当前后端后置处理器PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// loadTimeWeave逻辑if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

调用beanFactoryPostProcessor的核心实现,注意 BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的一个实现

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {// 存放处理过的beanSet<String> processedBeans = new HashSet<>();// 如果bean工厂实现了 BeanDefinitionRegistry 需要进行 BeanDefinitionRegistryPostProcessor 后置处理器逻辑,这里beanFactory是一个BeanDefinitionRegistryif (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;// 存放普通的BeanFactoryPostProcessorList<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();// 存放了实现 BeanDefinitionRegistryPostProcessor// BeanDefinitionRegistryPostProcessor接口是BeanFactoryPostProcessor的一个子接口// 在其中定义了 postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法,在普通的bean定义信息加载完成后,在初始化bean之前允许进一步添加Definition处理。List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();// 调用beanFactory中现在已经有的BeanFactoryPostProcessor的方法for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;        // 添加之前首先调用一个bean定义信息后置处理器的方法registryProcessor.postProcessBeanDefinitionRegistry(registry);// BeanDefinitionRegistryPostProcessor添加registryProcessors.add(registryProcessor);}else {// 普通的beanFactoryPostProcessor添加regularPostProcessors.add(postProcessor);}}// 实现调用的优先级逻辑,实现了PriorityOrdered,Ordered接口的优先调用。// 这整个优先级处理逻辑,获取BeanDefinitionRegistryPostProcessor的信息,根据优先级,getBean创建实例,然后调用BeanDefinitionRegistryPostProcessor的方法List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();// 拿到实现了PriorityOrdered接口的 BeanDefinitionRegistryPostProcessor进行调用// 这里忽略beanFactory.getBean 获取bean实例的过程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);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();// 拿到实现了Ordered接口的 BeanDefinitionRegistryPostProcessor进行调用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);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();// 调用剩余的 BeanDefinitionRegistryPostProcessors 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);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();}// 调用BeanFactoryPostProcessor处理逻辑invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);}else {// beanFactory不是一个beanDefinitionRegistry那么也是直接调用beanFactoryPostProcessor的方法invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}// 获取或有BeanFactoryPostProcessor,又是一样的套路,先调用实现了优先级的,然后在调用普通的。BeanFactoryPostProcessor。String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {if (processedBeans.contains(ppName)) {// skip - already processed in first phase above}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);}}// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);// Next, invoke the BeanFactoryPostProcessors that implement Ordered.List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();for (String postProcessorName : orderedPostProcessorNames) {orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}sortPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);// Finally, invoke all other BeanFactoryPostProcessors.List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);// Clear cached merged bean definitions since the post-processors might have// modified the original metadata, e.g. replacing placeholders in values...beanFactory.clearMetadataCache();}

Spring容器创建流程(4)调用beanFactory后置处理器相关推荐

  1. Spring容器创建流程——总结

    spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情.refresh() 可在AbstractApplicati ...

  2. Spring源码|解析深入Spring源码多图剖析@Configuration背后的BeanFactory后置处理器实现逻辑

    揭秘@Configuration的秘密之BeanFactory后置处理器 前序文章 Spring如何扫描工作目录下的Bean?|图文并茂讲解@Configuration的工作原理 文章目录 揭秘@Co ...

  3. Spring容器创建流程(5)bean后置处理之注册

    registerBeanPostProcessors 注册bean的后置处理器(以前的执行流程可在系列文章中查看),注意 beanFactoryPostProcessor 是 bean工厂的后置处理器 ...

  4. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  5. Spring容器创建流程(8)初始化bean

    finishBeanFactoryInitialization(beanFactory); 很重要的一步,初始化剩余未初始化的bean(还没有创建实例放到容器中的). 容器refresh总览: syn ...

  6. Spring容器创建流程(9)完成创建

    Spring的refresh() 方法中finishRefresh()方法完成之后也就代表着,Spring容器真正的创建完成了.下面看finishRefresh()的源码. 容器refresh总览: ...

  7. Spring容器创建流程(7)事件派发机制

    Spring事件驱动,监听机制.由三步分组成,事件,派发器,监听器. 事件: spring事件的顶级父类是EventObject,通常情况下继承ApplicationEvent 自定义自己的事件. 事 ...

  8. Spring容器创建流程(6)国际化支持

    initMessageSource 初始化MessageSource,Spring国际化支持(之前的执行步骤可在系列文章中找到) 容器refresh总览: synchronized (this.sta ...

  9. Spring容器创建流程(1)容器创建准备

    本系列文章将逐一介绍,Spring容器创建到容器刷新完成每个过程. Spring容器继承结构图 第一步,new容器实例 ApplicationContext factory = new ClassPa ...

最新文章

  1. Processing 字体变形
  2. linux下的RPC
  3. C语言——判断是该年的第几天
  4. RocketMQ-PushConsumer配置参数详解
  5. 万里坑路第一步:1、cocos2d-js的JDKADK,SDK,apaceANT安装和环境变量设置
  6. 嵌入式软件设计第7次实验报告
  7. 注解 @EnableFeignClients 与 @ComponentScan 有冲突
  8. python无限锁屏_【python】定时锁屏,保护身体
  9. python魔方方法
  10. Teams Bot App 初探
  11. cesium城市建筑颜色渲染以及泛光渐变效果
  12. win10重置失败,重装系统踩坑
  13. Spring学习笔记之MyBatis
  14. 微信小程序 js创建Object对象
  15. QT creator 新建项目
  16. 【RAC】如何修改SCAN IP的IP地址、名称、端口等信息
  17. [转载]WIFI Direct/WIFI P2P
  18. 飞猪登录器推荐《怪物猎人世界》萌新入坑武器装备推荐
  19. 利用计算机诊断ct故障,皮克I/Q CT计算机电源故障修理
  20. HTML文本框样式大全

热门文章

  1. 教育|关于本科生科研的一些想法和建议
  2. 人工智能修复古董纪录片,还原1920年的北京城生活
  3. vmware.fusion虚拟机下的CentOS使用
  4. Cortex-M/R/A 芯片选型及简介
  5. M0/M3的异常和中断
  6. 实例浅析javascript变量作用域
  7. 十张叫做幸福的照片(贴图)
  8. java 实现队列读写锁_史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)...
  9. 网易手游《幻书启世录》将于2022年2月14日停止运营
  10. 支付宝、微信收款码明年3月1日起将禁止商用?系误读!