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

Spring--10--Spring Bean的生命周期

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.Spring Bean
    • 1.1 什么是 Bean
        • 简而言之,==bean 是由 Spring IoC 容器实例化、组装和管理的对象==。
    • 1.2 Spring框架管理Bean对象的优势
  • 2.Bean的生命周期
        • ==实例化 -> 属性赋值 -> 初始化 -> 销毁==
    • 1.实例化Bean
    • 2. Bean属性填充
    • 3.初始化Bean操作
        • 初始化阶段又可以分为几个步骤:
    • 4.销毁Bean


1.Spring Bean

1.1 什么是 Bean

我们来看下 Spring Framework 的官方文档:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.
在这里插入图片描述

简而言之,bean 是由 Spring IoC 容器实例化、组装和管理的对象

1.2 Spring框架管理Bean对象的优势

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

2.Bean的生命周期

Spring Bean 的生命周期来说:

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁

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

在这里插入图片描述

Spring中的bean的生命周期主要包含四个阶段:实例化Bean --> Bean属性填充 --> 初始化Bean -->销毁Bean

1.实例化Bean

  • 首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化,实际上就是通过反射的方式创建出一个bean对象

2. Bean属性填充

  • Bean实例创建出来后,接着调用populateBean()DI注入 设置对象属性值,也就是注入这个Bean依赖的其它bean对象(循环依赖 三级缓存)

3.初始化Bean操作

在这里插入图片描述

初始化阶段又可以分为几个步骤:
  1. 执行Aware接口的方法
  2. BeanPostProcessor的前置处理方法postProcessBeforelnitialization()
  3. 户自定义的初始化方法,如init-method
  4. BeanPostProcessor的后置处理方法postProcessAfterinitialization()

1.执行Aware接口的方法,Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的些资源。

  • 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
  • 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  • 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

2.执行BeanPostProcessor的前置处理方法postProcessBeforelnitialization(),对Bean进行一些自定义的前置处理

  • 判断Bean是否实现了InitializingBean接口,如果实现了,将会执行lnitializingBean的afeterPropertiesSet()初始化方法;

3.执行用户自定义的初始化方法,如init-method等;

4.执行BeanPostProcessor的后置处理方法postProcessAfterinitialization()

  • AOP的实现代理对象

4.销毁Bean

初始化完成后,Bean就成功创建了,之后就可以使用这个Bean, 当Bean不再需要时,会进行销毁操作
在这里插入图片描述

  • 首先判断Bean是否实现了DestructionAwareBeanPostProcessor接口,如果实现了,则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法
  • 其次会判断Bean是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法
  • 最后判断这个Bean是否配置了dlestroy-method等自定义的销毁方法,如果有的话,则会自动调用其配置的销毁方法
    在这里插入图片描述

相关文章:

  • 应用密码学期末复习(3)
  • 如何使用GaussDB创建外表(FOREIGN TABLE)
  • STM32超声波——HC_SR04
  • 解读 | 为什么有很多名人让人们警惕人工智能
  • 【NR技术】NR NG-RAN整体架构 -功能划分(三)
  • 人工智能|深度学习——知识蒸馏
  • 基于单片机的定时插座在智能家居中的应用
  • Linux ln命令教程:如何创建符号链接(附案例详解和注意事项)
  • 双荧光素酶报告基因检测(五)
  • 大模型应用_AutoGPT
  • viple与物理机器人(一):线控模拟
  • MySQL InnoDB Replication部署方案与实践
  • EMQX(5.3.1)多机集群部署
  • 总结6种@Transactional注解的失效场景
  • 「差生文具多系列」推荐两个好看的 Redis 客户端
  • Akka系列(七):Actor持久化之Akka persistence
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • css选择器
  • JavaScript类型识别
  • jquery cookie
  • Just for fun——迅速写完快速排序
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis学习笔记 - pipline(流水线、管道)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关于springcloud Gateway中的限流
  • 前端_面试
  • 听说你叫Java(二)–Servlet请求
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 硬币翻转问题,区间操作
  • ​ubuntu下安装kvm虚拟机
  • #git 撤消对文件的更改
  • #前后端分离# 头条发布系统
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ros//EnvironmentVariables)ros环境变量
  • (第61天)多租户架构(CDB/PDB)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (排序详解之 堆排序)
  • (四)模仿学习-完成后台管理页面查询
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)linux下的时间函数使用
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ******之网络***——物理***
  • .NET Core 成都线下面基会拉开序幕
  • .NetCore 如何动态路由
  • .NET框架设计—常被忽视的C#设计技巧
  • .Net小白的大学四年,内含面经
  • @EnableConfigurationProperties注解使用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ SNOI 2013 ] Quare
  • [AIGC] 如何建立和优化你的工作流?
  • [Django ]Django 的数据库操作