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

Spring的bean的生命周期——bean的创建与销毁

1、生成类信息map

扫描包,用asm技术获取类信息,打了@ComponentScan@component@service等注解的类会放入map。key是类名,value是beanDefinition类的基本信息

2、加载类

context.getBean("userService")

从类信息map中获取beanDefinition,并加载类。如果加载了会记录下来,如果没加载就调用类加载器去加载类

3、创建bean对象

创建对象过程是:实例化(1-3)、处理属性(5-7)、初始化(8-10)。

1.实例化前。InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()

2.实例化

3.实例化后。MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()

4.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()

5.自动注入(依赖注入)

6.属性处理。InstantiationAwareBeanPostProcessor.postProcessProperties()。如@autowired

7.回调处理一些类信息。Aware对象

8.初始化前。BeanPostProcessor.postProcessBeforeInitialization()

9.初始化。执行InitializingBean初始化接口

10.初始化后。BeanPostProcessor.postProcessAfterInitialization()。如aop

创建出来的bean如果是单例,放到map中,key是bean名称,value是bean对象。如果是原型类,则不放入map,每次都执行上述的创建对象过程

实例化:先在beanDefinition中的supplier有没有返回对象,没有的话看beanFactory。实例化涉及推断构造方法。推断构造方法就是只有一个构造方法、执行这个构造方法;多个构造方法,执行@Autowired方法或者无参构造。有参构造的入参,回去beanMap中找,没有就创建。

aop:如果有aop则创建的bean是代理对象,执行流程是userService.test() --> aop切面逻辑如@before--> target.test()。 target是被代理对象

aop流程:找所有的切面类@Aspect、找切面中所有的pointCut,如@before@after等,看当前要创建的bean是否是pointCut需要的,是就创建代理对象

4、销毁bean

出发时机:spring容器关闭时

创建bean后,会把实现了DisposableBean接口的bean保存到一个map中,销毁容器AnnotationConfigApplicationContext.close()的时候会逐步处理清空这个map中的对象。

适配器模式:实现了AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName的都算是要销毁的。所以会把实现了AutoCloseable接口的类封装成DisposableBeanAdapter,而DisposableBeanAdapter实现了DisposableBean接口。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 灵岫科技技术二面\.(过了)
  • Go语言---文件分类、设备文件、磁盘文件、实现打开/写/读/关闭/拷贝文件
  • 20.js获取页面卷去的距离以及滚到到指定位置
  • LLaMA Pro:具有块扩展的渐进式 LLaMA[论文翻译]增量预训练 扩展transformer块
  • AI网络爬虫022:批量下载某个网页中的全部链接
  • 计算环形链表,环的长度
  • vb.netcad二开自学笔记1:万里长征第一步Hello CAD!
  • Kotlin Class
  • MQTT是什么,物联网
  • 微信小程序中wx.navigateBack()页面栈返回上一页时执行上一页的方法或修改上一页的data属性值
  • 【Sql Server修改列类型错误信息:对象名依赖于列】
  • Python从Excel表中查找指定数据填入新表
  • 对controller层进行深入学习
  • iOS 开发中,异步渲染和异步绘制
  • C++ | Leetcode C++题解之第225题用队列实现栈
  • 《Java编程思想》读书笔记-对象导论
  • 「面试题」如何实现一个圣杯布局?
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 08.Android之View事件问题
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • ComponentOne 2017 V2版本正式发布
  • ECMAScript6(0):ES6简明参考手册
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • javascript数组去重/查找/插入/删除
  • Java编程基础24——递归练习
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 你真的知道 == 和 equals 的区别吗?
  • 三分钟教你同步 Visual Studio Code 设置
  • 试着探索高并发下的系统架构面貌
  • 算法---两个栈实现一个队列
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • nb
  • mysql面试题分组并合并列
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #565. 查找之大编号
  • #define 用法
  • #pragma multi_compile #pragma shader_feature
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $GOPATH/go.mod exists but should not goland
  • (~_~)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C++)八皇后问题
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)windows配置JDK环境
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (五)MySQL的备份及恢复
  • (转)GCC在C语言中内嵌汇编 asm __volatile__