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. 测试模型吞吐量 运行测试总结 在机器学习和深度学习中,模型的推理性能是一个非常重要的指标。它可以帮助我们了解模型在实际应用…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
