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. 测试模型吞吐量 运行测试总结 在机器学习和深度学习中,模型的推理性能是一个非常重要的指标。它可以帮助我们了解模型在实际应用…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...