Spring IOC 容器 Bean 加载过程

news2024/12/23 10:04:27

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.coloradmin.cn/o/359091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新版本 | 异步复制、交易日历、自定义状态函数......请查收!

大家好~DolphinDB 最新版本近日已经发布,本次的 V2.00.9 与 V1.30.21 新版本推出了很多新功能,并对数据库做了全方位提升,是迄今为止新增功能最多的一次更新。新特性一览我们先来看一看新特性包含哪些方面:1、数据库针对数据安全和…

管理.模型.SWOT

1. SWOT 在企业战略规划中,通过辨析企业自身的竞争优势(Strengths)、劣势(Weaknesses)和外部环境为企业带来的机会(Opportunities)和威胁( Threats),企业可制…

Interview系列 - 05 Java|Iterator迭代器|集合继承体系|Set List Map接口特性|List实现类区别

文章目录01. 迭代器 Iterator 是什么?02. 迭代器 Iterator 有什么特点?03. 迭代器 Iterator 怎么使用?04. 如何边遍历边移除 Collection 中的元素?05. Iterator 和 ListIterator 有什么区别?06. 数组和集合的区别&…

Alist ——本地网盘管理器

Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中,在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码,和端口进入浏览器 输入 :127.0.0.1:5244用…

java final关键字 详解

概述:作用:细节:演示:总结:一、概述 : final [ˈ faɪnl],最终的,最后的,决定性的,不可改变的。final作为Java中的一个关键字可以用来修饰类,方法&#xff0c…

【程序人生】从土木专员到网易测试工程师,薪资翻3倍,他经历了什么?

转行对于很多人来说,是一件艰难而又纠结的事情,或许缺乏勇气,或许缺乏魄力,或许内心深处不愿打破平衡。可对于我来说,转行是一件不可不为的事情,因为那意味着新的方向、新的希望。我是学工程管理的&#xf…

京东测试进阶之路:初入测试碎碎念篇

1、基本的测试用例设计方法 基本的测试用例设计方法(边界值分析、等价类划分等)。 业务和场景的积累,了解测试需求以及易出现的bug的地方。 多维角度设计测试用例(用户、业务流程、异常场景、代码逻辑)。 2、需求分析 …

idea自带maven位置、maven全局环境变量配置,安装jar到本地 mac

声明:本教程为mac版教程,Windows请路过 idea自带maven3配置全局环境变量 mac电脑maven3位置/Applications/IntelliJ\ IDEA.app/Contents/plugins/maven/lib/maven3配置全局变量,编~/.profile文件(没有则新建) export MAVEN/App…

JVM-JMM内存模型(happens-before、volatile)

前言 由于计算机的存储设备与处理器的运算速度有几个数量级的差距所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。 将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算…

Day895.MySql误删数据还原方案 -MySQL实战

MySql误删数据还原方案 Hi,我是阿昌,今天学习记录的是关于MySql误删数据还原方案的内容。 传统的高可用架构是不能预防误删数据的,因为主库的一个 drop table 命令,会通过 binlog 传给所有从库和级联从库,进而导致整…

研报精选230220

目录 【行业230220国信证券】银行业行业专题:经济复苏中的优质中小银行【行业230220国信证券】汽车行业周报(2023年第7周):吉利将发布新品牌“银河” ,2022年宇通纯电动客车获欧洲销量冠军【行业230220开源证券】商贸零…

Java File相关操作

文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…

【Java期末复习】《面向对象程序设计》练习库

目录 一、单选题 二、填空题 三、程序填空题 1、 super使用--有如下父类和子类的定义,根据要求填写代码 2、简单加法计算器的实现 3、House类 4、矩形类 5、创建一个Box类,求其体积 四、函数题 6-1 求圆面积自定义异常类 6-2 判断一个数列是…

基于某业务单登陆场景并发测试实战

文章目录1 测试目的2 测试目标和测试对象3 名词解释4 测试说明5 测试环境和工具5.1 测试工具5.2 测试环境5.3 人力计划6 测试用例6.1 方案设计6.2 接口地址6.3 接口参数6.3.1 header参数6.3.2 请求参数7 脚本设计8 监控数据8.1 虚拟用户并发情况8.2 事务响应时间8.3 每秒点击次…

IP定位的具体网络应用

IP定位的原理是利用访问终端的注册信息和时延信息来估算现实中的地理位置,结合先进的定位算法服务,最高精确度能达到街道级,深受用户的喜爱。IP定位接口是一种通过IP地址来确定设备或用户位置的技术,主要应用于以下几个方面&#…

Windows平台上达梦数据库的ODBC安装与配置

文章目录概述安装包准备安装ODBC驱动配置ODBC数据源概述 最近很多公司都在响应信创,需要切换到国产数据库,然而很多数据库的一些基础组件的使用都没有一个很明确的官方文档。为了避免更多的人踩坑,本人将踩过的坑总结成博文,分享…

【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十四章SD卡读写…

网络小白入门之路--锐捷RGOS日常管理

锐捷作为网络界的一名重要成员,其设备的管理系统RGOS也是我们要学习的重要一环,那么今天我们就一起看下锐捷RGOS的日常管理。 锐捷设备日常登录方式: 本地登陆: Console登陆:全新或配置清空的设备,需要使…

TeX文件和md文件的转换

1 tex文件转换为md文件 1.1 安装 pandoc 首先安装 pandoc 到你的电脑 pandoc 1.2 命令行 可以在vscode终端输出入以下命令,命令运行路径为tex文件所在 cd tex文件所属的目录 pandoc -s tex文件名.tex -o md的文件名.md1.3预览 发现最后md文件只有一部分转化成…

171、【动态规划】leetcode ——309. 最佳买卖股票时机含冷冻期 (C++版本)

题目描述 原题链接:309. 最佳买卖股票时机含冷冻期 解题思路 本次难点在于多了一个冷冻期,大体的状态过程是三个:持有股票、不持有股票、冷冻期。在不持有股票时候,又可分为之前就不持有股票并继续保持、今天才卖出股票明天是冷…