目的:

spring在完成一个bean的初始化、实例化的过程中,会用到九个后置处理器;本文梳理出这九个后置处理器

九大后置处理器

spring在初始化的过程中,会在九个地方分别调用了五个后置处理的九个方法

第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation

InstantiationAwareBeanPostProcessor --> postProcessBeforeInstantiation方法
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法可以返回任何类型,如果返回的对象不为null,就调用beanPostProcessor的postProcessAfterInitialization方法;如果返回null,就正常的执行流程;该后置处理器
在spring AOP当中,spring如果判断当前类100%不需要进行增强,会把这个bean放到一个map中,并将value置为false,那么在后面进行增强的时候,会排除这个map中的bean

第二次调用后置处理器,该后置处理器推断使用哪个构造函数来初始化bean对象

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
InstantiationAwareBeanPostProcessor --> determineCandidateConstructors();推断使用哪个构造函数来初始化bean对象

在推断使用哪一个构造函数的时候,会首先判断当前构造函数是否有@Value和@Autowired注解,如果没有,那就校验当前构造方法对应的bean和传来的beanClass是否一样,如果是同一个,就把当前构造函数赋值给defaultConstructor在第二次调用后置处理器的时候,会返回当前可用的构造函数,由此来决定,使用哪个构造函数来创建bean

都三次调用后置处理器

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors

调用的是MergedBeanDefinitionPostProcessor --> postProcessMergedBeanDefinition 第三个后置处理器,是后面生命周期流程中的某些流程缓存一些meta信息

比如:在CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor的postProcessorMergedBeanDefinition的方法中,会调用finAutowiringMetadata和findResourceMetadata方法,将当前bean所依赖的bean(@Autowired和@Resource注解)存到一个map中,后面在进行属性注入的时候,会先从这个map中找当前bean依赖的bean有哪些,如果map中为空,就再查找要注入的属性有哪些
再比如:在CommonAnnotationBeanPostProcessor的这个方法中,将@PostConstrct和@PreDestroy注解对应的方法,缓存起来,在后面调用初始化的后置处理器的时候,先从这里存的map中找方法,找到,就直接执行即可
这些提前缓存的操作,都是在这个后置处理器完成的

第四次调用后置处理器 循环依赖

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor --> getEarlyBeanReference 第四个后置处理器(把创建的对象 放到earlySingletonObjects,解决循环依赖的),处理循环依赖问题会用到这个后置处理器
这里通过后置处理器,暴露出一个ObjectFactory(个人理解是一个bean工厂),可以完成bean的实例化等操作;这里的方法不会立即执行,只有执行到objectFactory.getObject()方法的时候,才会执行

第五次调用后置处理器 判断是否需要进行属性填充

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation
调用的是InstantiationAwareBeanPostProcessor --> postProcessAfterInstantiation 第五个后置处理器(判断是否需要填充属性)
如果我们需要在程序中自己注入属性,可以利用这个点,在这里返回false,那么spring就不会调用下面这个后置处理器来注入属性

第六次调用后置处理器 进行属性注入

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessPropertyValues
调用的是InstantiationAwareBeanPostProcessor --> postProcessPropertyValues 第六个(处理类的属性值)
主要是CommonAnnotationBeanPostProcessor(用来处理@Resource注解)和AutowiredAnnotationConigApplication(处理@Autowired和@Value注解);如果是自动注入(AutowireMode不为null),是无需通过后置处理器来进行属性注入的

第七次调用后置处理器 执行初始化方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
调用的是BeanPostProcessor --> postProcessBeforeInitialization bean初始化方法
CommonAnnotationBeanPostProcessor 继承了 InitDestroyAnnotationBeanPostProcessor,在该后置处理器处理的是@postconstruct注解

第八次调用后置处理器 springAop

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
调用的是BeanPostProcessor --> postProcessAfterInitialization bean初始化之后执行的方法,典型应用:对aop进行处理,对目标类生成代理对象

第九次是在销毁bean容器的时候调用的

在调用ac.close()方法的时候,会调用该后置处理器 org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeDestruction
处理 @PreDestroy注解,destroy-method和destroy()方法

spring源码:九大后置处理器相关推荐

  1. Spring源码篇一之beanFactory的真身和6大后置处理器的注册

    当你的才华还撑不起你的野心的时候,唯有静下心来学习. spring运行流程图(https://www.processon.com/view/5f3fcab8e0b34d07118258cb?fromn ...

  2. Spring的9处调用后置处理器

    在Sping的整个生命周期中,有9个地方调用后置处理器.这些后置处理器是spring实现自定义功能或者扩展spring的核心所在 一.实例化前 该方法属于InstantiationAwareBeanP ...

  3. java面试简历精通n_面试3年java程序员说精通spring源码 听完后觉得还是劝退好

    面试官:看你简历上写了读过Spring源码,是吗? 我: 是的 面试官:读过哪些部分的? 我:读过Spring的启动过程源码,比如扫描包.执行Bean工厂后置处理器.Bean的生成过程等(自信满满) ...

  4. 攀登Spring珠穆朗玛峰:前置与后置处理器

    文章目录 Spring的前置与后置处理器 前提知识 前置与后置处理器定义 前置处理器:BeanFactoryPostProcessor `postProcessBeanFactory`调用 后置处理器 ...

  5. Spring 详解Bean的后置处理器

    Bean的后置处理器详解: Spring当中的后置处理器是Spring体用的一个扩展点,开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例 ...

  6. Spring之BeanPostProcessor(后置处理器)介绍

      为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor   该接口我们也叫后置处理器,作用是在Be ...

  7. spring的后置处理器(未完结版)

    学习spring源码也有一阶段时间了,是时候收货的季节了,打算写几篇博客,把自己的知识沉淀下来.在学习spring的源码之前,别人问我spring什么牛逼.我会毫不犹豫的说出AOP,IOC啊.但是看看 ...

  8. Spring中Bean的后置处理器

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html: Bean后置处理器 BeanPostProce ...

  9. Spring源码深入阅读AnnotationConfigApplicationContext

    一直很好奇代码 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SimpleBe ...

最新文章

  1. angular监听图片加载完成_angular1.0 如何监听页面渲染完毕 (转)
  2. 谈谈晋升-互联网民工篇
  3. ext显示服务器文件,使用linux的fsck.ext2命令检查及修复ext2文件系统
  4. Linux基础之文件权限详解
  5. Redis学习---(11)Redis 有序集合(sorted set)
  6. 计算机考研英语书,我的计算机考研复习经验 (分5大部分,很详细)
  7. 《深度学习笔记》——防止梯度消失的学习笔记
  8. 16. Element contentEditable 属性
  9. 硬件设计论坛_疫情让硬件教育迎百年巨变 EDA365 电子论坛成为主角
  10. 简历太空白怎么办?如何写简历
  11. 重装系统笔记本电脑黑屏怎么办
  12. Hibernate Session.get()和Session.laod()的区别
  13. 如何完全的卸载ArcGIS?
  14. 工业物联网解决方案:PLC数据上云
  15. 数据结构之ISAM文件和VSAM文件
  16. DHT11温湿度LCD显示
  17. CVPR 2022 结果出炉,最全论文下载及分类汇总(更新中)
  18. 错误 0xc00470fe: 数据流任务: 产品级别对于 组件“源 - TestDB01$”(1) 而言不足
  19. 俄语专业个人简历范文
  20. 从0开始写一个小程序

热门文章

  1. 如何写一个仿真文件——testbench
  2. vue3运行npm run serve报错ERROR Error: Cannot find module ‘babel-plugin-import‘ Require stack:
  3. apple tv设置_如何设置Apple TV以自动打开电视或媒体中心
  4. Computer-System Structures八大思想
  5. 基于单片机节水定时智能控制器设计-毕设课设资料
  6. 电脑桌面变窄屏,两端为黑色
  7. SQL注入原理及绕过技术
  8. 2022年山东最新交安安全员考试模拟题及答案
  9. 【华为上机试题C++】老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
  10. linux基础知识复习学习笔记