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

Spring IOC 容器 Bean 加载过程

Spring IOC 容器 Bean 加载过程

在这里插入图片描述

Spring 对于我们所有的类对象进行了统一抽象,抽象为 BeanDefinition ,即 Bean 的定义,其中定义了类的全限定类名、加载机制、初始化方式、作用域等信息,用于对我们要自动装配的类进行生成。

Spring 会读取我们需要装配的类的元数据信息,将其转换注册为 BeanDefinition ,元数据 MateData 即指类的字符文本表示,将其放入Bean 定义的容器中,这个过程经历了:

  1. 读取磁盘中的元数据 BeanDefinitionReader
  2. 扫描需要装配的类 BeanDefinitionScanner
  3. 注册 BeanDefinition 到 BeanDefinition 容器中 (Map) BeanDefinitionRegister

在 Bean 定义注册完成后,类加载前,可以通过实现 Spring 提供的拓展点接口进行 BeanDefinition 的修改的添加,比如:

  1. 实现 BeanFactoryPostProcessor 的 postProcessBeanFactory 获取已注册的 Bean 定义并进行修改
  2. 实现 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法添加 Bean 定义

有了 BeanDefinition 就可以通过 BeanFactory 对应加载实例化 Bean ,Bean 的加载经过了以下过程:

  1. 通过反射实例化 Bean
  2. 对类的属性赋值如 @Value 、 @Autowear 等
  3. 类的初始化,执行初始化开始方法(如果有)
@Component
public class MyBean {public void init(){// 根据类名获取并在初始化时执行System.out.println("MyBean initialization logic");}public void destroy(){System.out.println("MyBean destruction logic");}
}
  1. 最终放入单例缓存池。供后续使用

在整个加载过程中 Spring 在各个阶段执行前后提供了拓展点,如 :

  1. InstantiationAwareBeanPostProcessor:在Bean实例化之前执行拦截方法。(Aop 即通过该实现拓展点来完成的)
  2. BeanPostProcessor:在Bean实例化之后,执行拦截方法。

以及各种各样的发现 Aware 如:

  1. ApplicationContextAware:让Bean获得当前Spring容器的ApplicationContext实例。
  2. BeanNameAware:让Bean获得它在Spring容器中的Bean名称。
  3. BeanClassLoaderAware:让Bean获得它在Spring容器中的ClassLoader实例。
  4. BeanFactoryAware:让Bean获得当前Spring容器的BeanFactory实例。

此时 Bean 就到达了最终可用状态。

http://www.lryc.cn/news/14092.html

相关文章:

  • 【DRF】Django Rest Framework(5.DRF中的通用视图类-GenericAPIView方法说明与使用说明)
  • STM32 OTA应用开发——自制BootLoader
  • 时域和频域的简单理解
  • 华为OD机试 - 第 K 个最小码值的字母 | 机试题算法思路 【2023】
  • 离散数学笔记_第一章:逻辑和证明(1)
  • Rust FFI 与C语言互相调用
  • 从全局变量寻找到Tomcat回显方式
  • Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery
  • 关于机器人状态估计(12)-VIO/VSLAM的稀疏与稠密
  • Python每日一练(20230220)
  • 技术总监的“技术提升”
  • kettle安装部署_简单认识_Spoon勺子界面---大数据之kettle工作笔记002
  • 第三章 Kafka生产问题总结及性能优化实践
  • Comparable和Comparator的区别
  • 全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。
  • 简洁易用的记账小程序——微点记账
  • Windows平台上达梦数据库的ODBC安装与配置
  • 哈希表的介绍
  • spring cloud gateway 实现redis动态路由及自动项目路由上报
  • c++函数对象(仿函数)、谓词、内建函数对象
  • 物联网对供应链管理的影响
  • c++ 那些事 笔记
  • 心跳机制Redis
  • 蓝桥杯算法训练合集十七 1.数字反转2.试题39713.矮人采金子4.筛法5.机器指令
  • 第一章 初识 Spring Security
  • 2023-02-20 关于回朔的思考
  • 推荐系统[八]算法实践总结V1:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】
  • 适合初学者的超详细实用调试技巧(下)
  • C# String与StringBuilder 的区分
  • 【麒麟】基于GPS北斗卫星技术的NTP网络时间服务器