当前位置: 首页 > news >正文

【HBZ分享】bean的生命周期 以及 各个阶段在spring的哪个类被调用

  1. Ioc容器通过配置文件读取bean的定义信息,并保存在BeanDefinition中
  2. 执行BeanFactoryPostProcessor的postProcessBeanFactory方法,对bean定义的信息进行处理,这里还是可以设置bean的基本信息,比如:单例多例,初始化方法指定,销毁方法指定等属性的配置
  3. 通过反射,实例化对象,构造函数被调用
  4. 设置属性值
  5. 如果目标类实现了BeanNameAware类,则该步会执行BeanNameAware中的setBeanName方法
  6. 如果目标类实现了BeanFactroyAware类,则该步会执行BeanFactroyAware中的setBeanFactory方法
  7. 如果目标类实现了ApplicationContextAware类,则该步会执行ApplicationContextAware中的setApplicationContext方法
  8. 调用BeanPostProcessor的postProcessBeforeInitialization方法,可以对目标类中的成员变量进行初始值得设置
  9. 执行目标类得初始化方法:如果实现InitializingBean则调用afterPropertiesSet方法, 如果是在配置文件 或 BeanFactoryPostProcessor中配置了init-method,则会执行配置的方法
  10. 调用BeanPostProcessor的postProcessAfterInitialization方法,可以对目标类中的成员变量进行初始值得设置
  11. Bean准备就绪,如果是【单例】,则保存到spring缓冲池。 如果是【多例】,则把准备就绪的bean交给调用者
  12. 如果实现了DisposableBean,则调用destory方法对bean进行销毁。如果配置了destory-method,那就会调用指定的销毁方法

实战应用截图,输出顺序即bean的过程
在这里插入图片描述

各个阶段在spring的哪个类被调用

  1. BeanFactoryPostProcessor(Bean工厂的后置处理类): 在AbstractApplicationContext类的invokeBeanFactoryPostProcessor()方法被调用
  2. BeanPostProcessor(Bean的后置处理类): 在AbstractApplicationContext类的registryBeanPostProcessor()方法被调用
  3. postProcessBeforeInitialization 和 postProcessAfterInitialization: 在AbstractApplicationContext类的finishBeanFactoryInitialization()方法被调用
  4. 普通bean(我们自己创建的):在AbstractApplicationContext类的finishBeanFactoryInitialization()方法被调用
  5. BeanNameAware,BeanFactroyAware,ApplicationContextAware:在AbstractApplicationContext类的finishBeanFactoryInitialization()方法被调用
  6. 总入口:ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“classpath*:beanLife.xml”);中,进入 ClassPathXmlApplicationContext这个类构造方法,里面有一句refresh()这个方法,当调用这个方法后,才会执行上面的bean生命周期整个步骤,即new ClassPathXmlApplicationContext(“classpath*:beanLife.xml”);的时候,就会去执行refresh()方法。 fresh()方法依然在AbstractApplicationContext类中,并且每个步骤的执行顺序也是在refresh()中被规定的。
  7. finishBeanFactoryInitialization()这个方法,会实例化剩余所有的【单例】bean, 一定是单例的bean

在这里插入图片描述
在这里插入图片描述

== 即postProcessBeforeInitialization,postProcessAfterInitialization,BeanNameAware,BeanFactroyAware,ApplicationContextAware全都是在AbstractApplicationContext类的finishBeanFactoryInitialization()方法被调用==

总节Bean的生命周期

  1. 从 bean definition中读取,调用默认无参构造方法
  2. 填充属性
  3. 调用实现的各种Aware结尾中的方法
  4. 调用BeanPostProcessor后置处理器postProcessBeforeInitialization()方法
  5. 调用初始化方法init-method
  6. 调用BeanPostProcessor后置处理器postProcessAfterInitialization()方法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode75-8 递增的三元子序列
  • 在Windows MFC\C++编程中,如何使用OnCopyData函数
  • React 条件判断
  • MySql审计平台
  • MacOS Anaconda 安装教程及虚拟环境创建
  • 吴恩达:如何系统学习机器学习?
  • Java开发工具IDEA
  • 宿主机与容器(docker)之间的数据共享
  • celery使用
  • HDFS 之 文件流
  • proteus仿真c51单片机(四)双机串口通信(电路设计及代码)
  • 八 信息系统基础知识(考点篇)试题
  • Obsidian插件安装与开发
  • Thinkphp框架漏洞(附修复方法)
  • 【QT】鼠标按键事件 - QMouseEvent QKeyEvent
  • 【Leetcode】101. 对称二叉树
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【mysql】环境安装、服务启动、密码设置
  • Electron入门介绍
  • js数组之filter
  • Otto开发初探——微服务依赖管理新利器
  • Swift 中的尾递归和蹦床
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 记一次删除Git记录中的大文件的过程
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 入手阿里云新服务器的部署NODE
  • 三分钟教你同步 Visual Studio Code 设置
  • 思维导图—你不知道的JavaScript中卷
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我感觉这是史上最牛的防sql注入方法类
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 你对linux中grep命令知道多少?
  • 1.Ext JS 建立web开发工程
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • $.ajax()
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (20)docke容器
  • (k8s)Kubernetes本地存储接入
  • (windows2012共享文件夹和防火墙设置
  • (分类)KNN算法- 参数调优
  • (南京观海微电子)——I3C协议介绍
  • (南京观海微电子)——示波器使用介绍
  • (十) 初识 Docker file
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)UDP基本编程步骤
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)CentOS查看系统信息|CentOS查看命令