news 2026/9/6 3:12:40

Spring的bean工厂后处理器和Bean后处理器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring的bean工厂后处理器和Bean后处理器

Spring的bean工厂后处理器和Bean后处理器

一、基本原理

1.1原理一

Spring 的后处理器是 Spring 对外开发的重要扩展点,允许我们介入到 Bean 的整个实例化流程中来,以达到动态注册

BeanDefinition,动态修改 BeanDefinition,以及动态修改 Bean 的作用。Spring 主要有两种后处理器:

  • BeanFactoryPostProcessor:Bean 工厂后处理器,在 BeanDefinitionMap 填充完毕,Bean 实例化之前执行;

  • BeanPostProcessor:Bean后处理器,一般在Bean实例化之后,填充到单例池 singletonObjects之前执行。

1.2原理二

BeanFactoryPostProcessor 是一个接口规范,实现了该接口的类只要交由 Spring 容器管理的话,那么 Spring 就会回调该接口的方法,用于对 BeanDefinition 注册和修改的功能。

publicinterfaceBeanFactoryPostProcessor{voidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory);}

二、实验

2.1验证原理二

先定义一个类然后实现接口BeanFactoryPostProcessor,重写其方法postProcessBeanFactory

packagecom.itheima.processor;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.config.BeanFactoryPostProcessor;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;publicclassMyBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{System.out.println("BeanFactoryMap填充完毕,回调改方法");}}

将这个类在applicationContext.xml文件中配置成为bean:

<beanclass="com.itheima.processor.MyBeanFactoryPostProcessor"></bean>

结果:

综上所述,原理二得证。

2.2实验二通过ConfigurableListableBeanFactory获取到BeanDefinition,然后修改权限名

packagecom.itheima.processor;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.config.BeanDefinition;importorg.springframework.beans.factory.config.BeanFactoryPostProcessor;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;publicclassMyBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{System.out.println("BeanFactoryMap填充完毕,回调改方法");BeanDefinitionbeanDefinition=configurableListableBeanFactory.getBeanDefinition("userService");// 修改全限制名beanDefinition.setBeanClassName("com.itheima.service.impl.UserServiceImpl2");}}

结果:

2.3实验三通过BeanDefinition添加全限制定名

上一个实验我们通过BeanDefinition实现了修改全限定名,那么本实验将实现添加全限制定名,通过前面的学习我们可以知道xml中的bean标签实际上是封装在一个BeanDefinition中的,然后又将BeanDefinition封装成一个map,使用时就直接遍历这个map,然后通过反射,最终是创建到单例池当的map中,调用getBean方法时则最终从该 Map 集合中取出 Bean 实例对象返回。详细可以看我的这篇博文[https://blog.csdn.net/2301_80749359/article/details/157357240?fromshare=blogdetail&sharetype=blogdetail&sharerId=157357240&sharerefer=PC&sharesource=2301_80749359&sharefrom=from_link]。

那么有添加全限定名,我们就需要创建一个BeanDefinition,下面是BeanDefinition的继承体系(选中BeanDefinition,按ctrl+h可以查看):

在开发过程中我们一般是使用RootBeanDefinition,所以直接new一个,然后再为其设置全限定名:

BeanDefinitionbeanDefinition=newRootBeanDefinition();beanDefinition.setBeanClassName("com.itheima.dao.impl.personDaoImpl");

当有了BeanDefinition还不够,按照流程我们还要将其放到BeanDefinition的map中,如果直接运行我们会发现报错:

当然从错误信息我们不难发现是一个叫DefaultListableBeanFactory的类再调用getbean方法,这启发我们使用DefaultListableBeanFactory来进行注册BeanDefinition,而目前我们只有ConfigurableListableBeanFactory,所以考虑将其强转为它的子类,然后进行注册BeanDefinition到BeanDefinition的map中。

DefaultListableBeanFactorydefaultListableBeanFactory=(DefaultListableBeanFactory)configurableListableBeanFactory;defaultListableBeanFactory.registerBeanDefinition("personDao",beanDefinition);System.out.println(beanDefinition);

增加完毕,撒花

^ <

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

✿✿✿✿✿✿✿✿✿✿✿✿✿✿ ✿

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 12:32:23

傅立叶光学的Matlab实现方法

一、核心原理与工具 傅立叶光学基于傅里叶变换理论&#xff0c;将光波的传播与频域分析结合。Matlab通过以下函数实现关键计算&#xff1a; fft2&#xff1a;二维傅里叶变换&#xff0c;将空间域光场转换为频域频谱。ifft2&#xff1a;逆傅里叶变换&#xff0c;恢复空间域信号。…

作者头像 李华
网站建设 2026/9/2 12:51:37

巴菲特如何看待公司社会责任:企业公民的角色

巴菲特如何看待公司社会责任&#xff1a;企业公民的角色 关键词&#xff1a;巴菲特、公司社会责任、企业公民、股东利益、长期价值 摘要&#xff1a;本文深入探讨了巴菲特对于公司社会责任的看法&#xff0c;将企业视为“企业公民”这一独特视角展开分析。详细阐述了背景知识&a…

作者头像 李华
网站建设 2026/9/4 22:34:16

【回溯】二叉树的所有路径

求解代码 public List<String> binaryTreePaths(TreeNode root) {List<String> ans new ArrayList<>();if (root null) {return ans;}StringBuilder sb new StringBuilder();backtrack(root, sb, ans);return ans;}private void backtrack(TreeNode root,…

作者头像 李华
网站建设 2026/9/1 13:13:03

AI原生应用里语义搜索的智能交互体验

AI原生应用里的「读心术」&#xff1a;解码语义搜索的智能交互体验 关键词 语义搜索、自然语言理解、预训练模型、向量检索、智能交互、上下文感知、多模态融合 摘要 在AI原生应用&#xff08;AI-Native Apps&#xff09;的浪潮中&#xff0c;用户交互正从「命令式输入」向…

作者头像 李华
网站建设 2026/8/30 15:29:47

AI原生应用赋能业务流程增强的关键要点

AI原生应用赋能业务流程增强&#xff1a;构建智能驱动的未来工作方式 1. 引入与连接&#xff1a;从辅助工具到核心引擎的转变 想象一家传统制造企业&#xff0c;过去十年间不断尝试引入各种AI工具优化生产流程——从预测性维护的孤立系统&#xff0c;到客户服务的聊天机器人&am…

作者头像 李华
网站建设 2026/9/3 0:24:24

基于SSH的BBS论坛系统_开题报告

目录 SSH框架简介BBS论坛系统功能模块技术实现方案系统特色设计开发环境配置 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 SSH框架简介 SSH框架是Struts2、Spring和Hibernate三个开源框架的整合&#…

作者头像 李华