Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor
点一下关注吧!!!非常感谢!!持续更新!!!
大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

目前已经更新到了:
- MyBatis(已更完)
- Spring(正在更新…)

延迟加载
Lazy-init 延迟加载,Bean 的延迟加载。
ApplicationContext 容器的默认行为是在启动服务器时所有 Singleton Bean 提前进行。
<!-- bean 的默认配置 -->
<bean id="wzkTestBean" class="wzk.WzkTestBean" lazy-init="false"
false 表示立即加载,表示在 Spring 启动的时候,立刻进行实例初始化。
如果不想让一个 Singleton Bean 在 ApplicationContext 实现初始化的时候被提前实例化,那可以配置其对应的值为 true。
如果设置了一个立即加载的 bean1,引用了一个延迟加载的 bean2,那么 bean1 在容器启动的时候会初始化,此时由于 bean2 是被 bean1 引用的,所以也会被实例化出来(当然,此时也符合第一次调用才初始化的原则)。
当然,也可以在配置上用 default-lazy-init 属性来控制延时初始化,比如下面的配置:
<beans default-lazy-init="true"><!-- no beans will be eagerly pre-instantiated... -->
</beans>
如果一个 bean 的 scope 属性为 scope = “pototype” 时,即使设置了 lazy-init=false,容器在启动的时候也不会立刻初始化,而是调用 getBean 方法实例化。
应用场景
- 开启延迟加载可以在一定程度上提高容器启动的时候的性能、运转的性能。
- 对于不会经常使用的 Bean,偶尔加载的时候再加载,节约资源。
FactoryBean 和 BeanFactory
基础介绍
BeanFactory 接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理 Bean 的一个工厂,具体使用它下面的子接口类型,比如 ApplicationContext,此处我们重点分析:FactoryBean
Spring 中 Bean 有两种,一种普通 Bean,一种是工厂 Bean(FactoryBean),FactoryBean 可以生成某一个类型的对象实例,也就是我们可以借助它来自定义 Bean 的创建过程。
Bean 创建的三种方式中的静态方法和实例化方法和 FactoryBean 作用类似,FactoryBean 使用较多,尤其是 Spring 框架一些组件中会使用,还有其他框架 和 Spring框架整合时使用。

其中的方法有:
- getObject
- getObjectType
- isSingleton
编写代码
WzkCompany
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkCompany {private String name;private String address;private String money;}
WzkCompanyFactoryBean
public class WzkCompanyFactoryBean implements FactoryBean<WzkCompany> {private String wzkCompanyInfo;public void setWzkCompanyInfo(String wzkCompanyInfo) {this.wzkCompanyInfo = wzkCompanyInfo;}@Overridepublic WzkCompany getObject() throws Exception {WzkCompany wzkCompany = new WzkCompany();String[] strs = wzkCompanyInfo.split(",");wzkCompany.setName(strs[0]);wzkCompany.setAddress(strs[1]);wzkCompany.setMoney(strs[2]);return wzkCompany;}@Overridepublic Class<?> getObjectType() {return WzkCompany.class;}@Overridepublic boolean isSingleton() {return true;}
}
编写配置
<bean id="wzkCompanyBean" class="wzk.factory.WzkCompanyFactoryBean"><property name="companyInfo" value="公司名字,公司地址,1000"></property>
</bean>
测试运行
此时我们执行代码的时候:
Object wzkCompany = applicationContext.getBean("wzkCompanyBean");
输出的结果是构建出来的对象:
name="公司名字" address="公司地址" money="1000"
那我们如果需要获取到 FactoryBean 的时候,我们需要这么写:
Object wzkCompany = applicationContext.getBean("&wzkCompanyBean");
此时运行输出的结果就是:
wzk.factory.WzkCompanyFactoryBean@xxxx
后置处理器
Spring 提供了两种后处理 Bean 的扩展接口,分别是:
- BeanPostProcessor
- BeanFactoryPostProcess
工厂初始化 BeanFactory -> Bean 对象,在 BeanFactory 初始化之后可以使用 BeanFactoryPostProcessor 进行后置处理做一些事情,在 Bean 的对象实例化(并不是 Bean 的整个生命周期完成)之后可以使用 BeanPostcessor 进行后置处理做一些事情。
注意:对象不一定是 SpringBean,而 SpringBean 一定是个对象。
BeanPostProcessor
BeanPostProcessor 是针对 Bean 级别的处理,可以针对具体的某个 Bean。

其中对应的方法有:
- postProcessBeforeInitialization
- postProcessAfterInitialization
该接口提供了两个方法,分别在 Bean 的初始化方法前和初始化方法之后执行,具体这个初始化方法指的是什么方法,类似我们在定义 Bean 的时候,定义了 init-method 所指定的方法。
定义一个类实现了 BeanPostProcessor,默认是会对整个 Spring 容器中所有的 Bean 进行处理,如果针对具体的某个 Bean 处理,可以通过方法参数判断,两个类型参数分别为 Object 和 String,第一个参数是每个 Bean 的实例,第二个参数是每个 Bean 的 name 或者 id 属性的值。
所以我们通过第二个参数,来判断将要处理的具体的 Bean。
注意:处理是发生在 Spring 容器的实例化和依赖注入之后。
BeanFactoryPostProcessor
BeanFactory 级别的处理,是针对整个 Bean 的工厂进行处理,典型:
- PropertyPlaceholderConfigure

其中的方法如下:
- postProcessBeanFactory
此接口只有一个方法,该参数定义了一些方法:

其中有个 getBeanDefinition 方法,我们可以根据此方法,找到我们定义 Bean 的 BeanDefinition 对象,然后我们可以对定义的属性进行修改,以下 BeanDefinition 中的方法:

方法名字类似我们的标签属性,setBeanClassName 对应 bean 标签中的 class 的属性,所以当我们拿到 BeanDefinition 对象时,我们可以手动修改 Bean 标签中所定义的属性值。
BeanDefinition对象:在 XML 定义中的 Bean 标签,Spring 解析 Bean 标签称为一个JavaBean,这个 JavaBean 就是 BeanDefinition。
注意:调用 BeanFactoryPostProcessor 方法时,这时候 Bean 还没有实例化,此时 Bean 刚被解析为 BeanDefinition 对象。
相关文章:
Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
HTML4笔记
尚硅谷 一、前序知识 1.认识两位先驱 2.计算机基础知识 3.C/S架构与B/S架构 4.浏览器相关知识 5.网页相关概念 二、HTML简介 1.什么是HTML? 2.相关国际组织(了解) 3.HTML发展历史(了解)** 三、准备工作 1.常用电脑设置 2.安装Chrome浏览器 四、HTML入门 1.HTML初体验 2.H…...
python报错ModuleNotFoundError: No module named ‘visdom‘
在用虚拟环境跑深度学习代码时,新建的环境一般会缺少一些库,而一般解决的方法就是直接conda install,但是我在conda install visdom之后,安装是没有任何报错的,conda list里面也有visdom的信息,但是再运行代…...
linux-21 目录管理(一)mkdir命令,创建空目录
对linux而言,对一个系统管理来讲,最关键的还是文件管理。那所以我们接下来就来看看如何实现文件管理。当然,在文件管理之前,我们说过,文件通常都放在目录下,对吧?所以先了解目录,可能…...
总结-常见缓存替换算法
缓存替换算法 1. 总结 1. 总结 常见的缓存替换算法除了FIFO、LRU和LFU还有下面几种: 算法优点缺点适用场景FIFO简单实现可能移除重要数据嵌入式系统,简单场景LRU局部性原理良好维护成本高,占用更多存储空间内存管理,浏览器缓存L…...
【Vue】如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程
如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程。 安装 Vuex 首先,在你的 Vue 3 项目中安装 Vuex。可以使用 npm 或 yarn: npm install vuexnext --save # or yarn add vuexnext创建 Store 在 Vue 3 中,你可以使用 creat…...
VSCode 插件开发实战(十五):如何支持多语言
前言 在软件开发中,多语言支持(i18n)是一个非常重要的功能。无论是桌面应用、移动应用,还是浏览器插件,都需要考虑如何支持不同国家和地区的用户,软件应用的多语言支持(i18n)已经成…...
面试241228
面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用,6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…...
Python数据序列化模块pickle使用
pickle 是 Python 的一个标准库模块,它实现了基本的对象序列化和反序列化。序列化是指将对象转换为字节流的过程,这样对象就可以被保存到文件中或通过网络传输。反序列化是指从字节流中恢复对象的过程。 以下是 pickle 模块的基本使用方法: …...
Spring Boot对访问密钥加解密——HMAC-SHA256
HMAC-SHA256 简介 HMAC-SHA256 是一种基于 哈希函数 的消息认证码(Message Authentication Code, MAC),它结合了哈希算法(如 SHA-256)和一个密钥,用于验证消息的完整性和真实性。 HMAC 是 “Hash-based M…...
HTML 元素:网页构建的基础
HTML 元素:网页构建的基础 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基石。它定义了网页的结构和内容,而HTML元素则是构成HTML文档的基石。在本篇文章中,我们将深入探讨HTML元素的概念、类型、用法,以及如何在网页设计中有效地使用它们。 什么是HT…...
HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
在 iPhone 拍摄照片时,默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点,但在某些设备或软件上可能存在兼容性问题。因此,将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂…...
爆肝1个月:DDR4 的信号完整性(万字长文SI)
前言: 大学里面,总有很多课程,很浪费时间,学了没点用处,问过老师,为什么信号完整性,示波器使用等课程不开呢,这种是对工作真实有帮助的? 老师:因为老师…...
前端js验证码插件
相关代码,在最上方的绑定资源...
关于easy-es对时间范围查询遇到的小bug
前言:在使用easy-es之前作为一个小白的我只有es原生查询的基础,在自己通过查看官方文档自学easy-es遇到了一个挫折,其他的还好语法和MybatisPlus差不多,正以为我觉得很快就能入手,在对时间范围的判断就给我当头一棒&am…...
Mask R-CNN
目录 摘要 Abstract Mask R-CNN 网络架构 Backbone RPN Proposal Layer ROIAlign bbox检测 Mask分割 损失计算 实验复现 总结 摘要 Mask R-CNN是在Faster R-CNN的基础上进行改进的目标检测和实例分割网络。Faster R-CNN主要用于目标检测,输出对象的边…...
大模型-Dify使用笔记
大模型-Dify使用笔记 0、调整docker镜像源1、安装1、Docker Compose方式部署 2、访问 Dify 0、调整docker镜像源 由于墙的存在,所以默认的docker镜像源很难拉取项目,需要调整相关的docker配置文件 vim /etc/docker/daemon.json添加如下docker镜像源 { …...
Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇
历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...
云原生架构中的中间件容器化:优劣势与实践探索
在云原生架构逐步推进的过程中,许多企业已经开始将应用和服务容器化,以充分利用云计算带来的弹性和自动化。随着容器技术的发展,容器化不仅仅限于应用层,越来越多的中间件也被考虑纳入容器化范畴,包括Redis、Kafka、Ra…...
如何测试模型推理性能:从零开始的Python指南
如何测试模型推理性能:从零开始的Python指南 什么是模型推理性能?测试模型推理性能的步骤1. 监测内存使用情况2. 测试模型吞吐量 运行测试总结 在机器学习和深度学习中,模型的推理性能是一个非常重要的指标。它可以帮助我们了解模型在实际应用…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
