一、BeanFactoryPostProcessor和BeanPostProcessor

BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性

BeanPostProcessor的作用是在bean完成创建实例、填充属性之后,初始化阶段的前后都会对bean进行操作,使用postProcessBeforeInitialization和postProcessAfterInitialization。

BeanFactoryPostProcessor控制BeanDefinition流程:

  1. 自定义类实现BeanFactoryPostProcessor接口,实现postProcessBeanFactory方法
  2. 执行postProcessBeanFactory方法修改BeanDefinition

BeanPostProcessor知道初始化前后操作方法:

  1. 自定义类实现BeanPostProcessor,实现postProcessBeforeInitialization和postProcessAfterInitialization方法
  2. 将自定义BeanPostProcessor添加到beanFactory中(手动添加)
  3. 在初始化方法中,会先后(相对于初始化)遍历beanFactory的BeanPostProcessor,并调用before/after方法。

BeanFactoryPostProcessor逻辑
加载并读取文件 ----> 注册BeanDefinition ----> 自定义BeanFactoryPostProcessor并执行postProcessBeanFactory

BeanPostProcessor逻辑:
加载BeanDefinition ----> 自定义BeanPostProcessor并加入到beanFactory中 ----> 初始化方法中Spring扫描BeanPostProcessor集合,调用before/after方法

二、初始化和销毁

Bean的创建流程:

  1. 创建实例
  2. 填充属性
  3. 初始化
  4. 注册销毁方法(注册销毁方法的适配器,包含销毁方法,bean名称等)

初始化:
先判断Bean是否实现InitializingBean,如果实现则执行初始化方法。然后再遍历BeanDefinition中的初始化方法并通过反射执行。

销毁方法:
先判断Bean是否实现DisposableBean,再从存放销毁方法的集合中获取bean的销毁适配器,执行销毁方法。

三、Aware接口

Aware接口的作用是:

允许实现了接口的实例bean可以获取bean所在的beanfactory/applicationcontext等,进而使用其他服务(bean中需要增加beanfactory/applicationcontext属性)

BeanFactoryAware,在初始化前操作前,实例化后,判断bean是否实现接口,如果实现,则注入bean的beanfactory属性

BeanApplicationContextAware,在初始化前操作中注入属性。

四、Bean的作用域

Bean的作用域:

  1. 创建实例

  2. 填充属性

    (设置aware)

  3. 初始化前 初始化 初始化后

  4. 注册销毁方法

  5. 将bean注册到容器中

Bean的作用域:

  1. 单例singleton:如果是单例,则有4、5
  2. 如果是prototype(每次使用则则销毁):则没有4、5

也就是说:原型bean没有销毁方法,不会存入容器

五、FactoryBean

在获取bean的时候,如果该bean实现了FactoryBean接口,则调用getObject方法(可以将复杂的类转为自定义管理在容器中)

(sington直接获取并存入FactoryBean缓存中,下次从缓存中获取,prototype每次都调用getObject方法获取bean)

六、容器事件和事件监听

事件监听和容器事件:

  1. 在AbstractApplicationContext中先将事件监听器添加到事件发布者multicaster中

  2. 然后发布refresh容器刷新事件,(事件发布者发布事件,发布之后,遍历事件发布者中的监听器泛型是否是发布事件的类型,如果是就调用监听器中的方法)在这里插入图片描述

  3. 最后在AbstractApplicationContext中的doclose方法中发布关闭事件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910630.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910630.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910630.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8w字:推荐系统技术体系深度解析:从理论基础到工业实践的完整指南

插话:刚接触推荐系统还是大一下作比赛,然后找资料,顺便在巧合下在“识典百科”(现在叫快懂百科,抖音的,改好几回名了,还要一条条插入引用资料,现在看来,好像抖音也不在乎…

RA4M2开发IOT(8)----IIC驱动OLED

RA4M2开发IOT.8--IIC驱动OLED 概述视频教学样品申请硬件准备参考程序修改IIC驱动OLED属性配置移植SSD1306字符取模ASCII显示图片取模显示图片 概述 本章旨在通过 IC 接口驱动 OLED 显示屏(常见型号如 SSD1306),实现图形和文本的显示功能。OL…

数组题解——​轮转数组【LeetCode】

189. 轮转数组 通过三次反转操作,可以实现数组的轮转: 反转整个数组: 将数组完全反转,使得原数组的后 k 个元素移动到数组的前面。反转前 k 个元素: 将前 k 个元素反转,恢复它们的原始顺序。反转后 n - k 个元素: 将后 n - k 个元…

AR 眼镜之-条形码识别-实现方案

目录 📂 前言 AR 眼镜系统版本 条形码识别 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)相机App显示模块 2)算法so库JNI模块 3)算法条形码识别模块 2. 💠 实现相机App显示模块 2.1 创建 Ba…

华为云 Flexus+DeepSeek 征文|基于 CCE 集群部署 Dify 平台工作流:科研论文翻译与 SEO 优化工具的全流程设计实践

华为云 FlexusDeepSeek 征文|基于 CCE 集群部署 Dify 平台工作流:科研论文翻译与 SEO 优化工具的全流程设计实践 背景 作为被科研论文折磨已久的大学生,希望研究成果能被更多人看到,尤其是在学术全球化的趋势下,论文翻…

C++对象继承详解:从入门到精通

继承是面向对象编程的三大特性之一,也是C中实现代码复用和多态的重要机制。本文将带你深入理解C继承的核心概念与应用。 一、继承的基本概念 1.1 什么是继承? 继承允许我们基于已有的类创建新类,新类(派生类)可以继…

Jenkins安装与配置全攻略:从入门到高级功能实战

在DevOps实践中,Jenkins作为最流行的持续集成工具之一,扮演着至关重要的角色。本文将全面介绍Jenkins的安装、配置及高级功能使用,帮助开发、运维和测试团队快速搭建高效的CI/CD流水线。 一、Jenkins安装 1.1 环境准备 Jenkins官网:https://jenkins.io 注意:Jenkins 2…

[OS_26] 计算机系统安全 | CIA原则 | 侧信道攻击

系统调用是唯一访问操作系统对象的途径 拒绝越权访问 →→ Confidentiality拒绝越权修改 →→ Integrity(再加上公平资源调度 →→ Availability) 在操作系统 API 上,我们可以构建命令行工具、编译器、数据库、浏览器等丰富的应用。 当越来越多用户开始共享计算机、…

Chromium 136 编译指南 macOS篇:编译优化技巧(六)

1. 引言 在现代软件开发的高效化进程中,编译优化已经从简单的性能调优发展为一门综合性的工程科学。对于Chromium 136这样一个包含超过2500万行代码的超大规模项目而言,编译时间往往成为制约开发效率的关键瓶颈。在典型的开发场景中,一次完整…

Spark教程6:Spark 底层执行原理详解

文章目录 一、整体架构概述二、核心组件详解1. SparkContext2. DAG Scheduler3. Task Scheduler4. Executor 三、作业执行流程1. DAG 生成与 Stage 划分2. Task 调度与执行3. 内存管理 四、Shuffle 机制详解1. Shuffle 过程2. Shuffle 优化 五、内存管理机制1. 统一内存管理&am…

xlsx-style 插件批量导出多个sheet表格excel中遇到的问题及解决

Vue2中 前端界面导出表格,使用XLSXS插件版本(^0.8.13)导出表格存在表格背景颜色无法正常展示,百分比数据没有正常展示 【有条件的尽量先升级高版本插件,此插件版本对样式支持度不够】 优先考虑插件版本升级 同样的使用方法在vue3中没有出现错…

Java后端与Vue前端项目部署全流程:从环境配置到Nginx反向代理

文章目录 1. 准备项目所需的环境2. 后端项目打包步骤 1:使用 Maven 打包步骤 2:定位生成的 JAR 包步骤 3:上传 JAR 包到 Linux 系统步骤 4:验证 Java 环境步骤 5:启动 JAR 包 3. 前端项目打包步骤 1:执行 B…

Mybatis踩坑之一天

background: 对接AML系统,日间实时需要送交易对手要素过去(目前主要是交易对手全名),夜间需要将历史交易送AML进行回溯,交互方式是文件。文件要素为日期、对手类型、对手名、交易流水之类。 设置对送AML的文件设计表…

【PyTorch】分布式训练报错记录-ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1)

最近,我在服务器上起基于PyTorch分布式框架的预训练实验,起初实验都在顺利进行,但是当我们把模型的深度与宽度调大之后,模型在训练几代之后便会出现如下的报错: WARNING:torch.distributed.elastic.multiprocessing.a…

有哪些词编码模型

有哪些词编码模型 词编码模型:是将自然语言符号映射为稠密的高维向量,使语义相近的词汇在向量空间中位置接近。 不过,也有部分模型会考虑字母或字符信息,如基于字节对编码(BPE)的模型会将单词拆分成子词,这里的子词可能是字母组合。 词编码模型的原理主要是通过机器学…

Mono 功能介绍与使用示例

Mono 功能介绍与使用示例 一、核心概念与特性 Mono 是 Spring Reactor 框架中的核心组件,属于响应式编程(Reactive Programming)模型,专注于处理包含 0 或 1 个元素 的异步序列[1][2][5]。其核心特点包括: 异步非阻…

5060Ti双显卡+LLaMA-factory大模型微调环境搭建

查看环境确定安装版本安装CUDA12.8安装Anaconda安装Visual Studio C桌面开发环境(编译llama.cpp需要)安装cmake(编译llama.cpp需要)安装llama.cpp(用于量化)安装huggingface-cli安装llama-factory安装PyTorch2.7.0安装bitsandbytes安装flash-attention加…

Lnmp和XunRuiCMS一键部署(Rocky linux)

先上传XunRuiCMS-Study.zip包到当前目录,可以去官网下载 #!/bin/bash # function: install nginx mysql php on Rocky Linux 9.5 with fixed PHP-FPM configip$(hostname -I | awk {print $1}) yhxunrui passwordxunrui123# 检查是否为root用户 if [ "$USER&qu…

高精度OFDR设备在CPO交换机中的应用

光电共封装(CPO)交换机的特点 核心需求:CPO将光模块与交换芯片集成封装,缩短电互连距离,降低功耗和延迟,但需解决以下挑战: 1.光器件微型化:硅光芯片、光纤阵列等需高精度制造。 …

Vulkan 通过 CMake 集成 Dear ImGUI

一、 目录与文件部署 从官网获取 IMGUI 代码库,在项目 extern 目录下新建 imgui 目录,将相关文件复制进去,构建出如下目录结构: . ├── build ├── extern │ ├── glfw │ ├── glm │ └── imgui │ ├…