当前位置: 首页 > news >正文

使用 Spring 的 FactoryBean 创建和获取 Bean 对象

在Spring框架中,FactoryBean接口提供了一种强大的机制来创建复杂的bean实例。本文将基于提供的代码示例,详细介绍如何通过FactoryBean创建bean对象,并展示如何获取这些bean实例以及它们所属的FactoryBean实例。

示例代码类

  1. 定义 MyBean 接口。

首先,我们定义一个简单的接口MyBean,它包含一个show方法:

public interface MyBean {/*** 显示信息*/void show();
}
  1. 实现 MyFactoryBean 类。

我们实现FactoryBean接口来创建MyBean类型的实例。在这个例子中,MyFactoryBean负责创建并返回实现了MyBean接口的对象:

@Component
public class MyFactoryBean implements FactoryBean<MyBean> {// 这个 myBean 成员变量,在本文中可以忽略,我自己用作其他用途使用的private MyBean myBean;@Overridepublic MyBean getObject() throws Exception {System.err.println("getObject");if(myBean == null) {myBean = new MyBean() {@Overridepublic void show() {System.err.println("MyFactoryBean.show");}};}return myBean;}@Overridepublic Class<?> getObjectType() {return MyBean.class;}
}

这里,MyFactoryBean使用了匿名内部类的方式实现了MyBean接口,并重写了show方法。其中定义了一个 myBean 成员变量,这个可以忽略,我自己用作其他用途使用的。

从Spring容器中获取实例对象

为了从Spring容器中获取MyFactoryBean生成的bean实例或MyFactoryBean本身,我们需要先获取 ApplicationContext 实例本身,下面代码中的 SpringContextHolder.getApplicationContext() 是我自己定义好的工具类,假设通过它获取到 ApplicationContext 对象。

以下是获取工厂类自身实例 和 工厂类产生的具体 Bean实例的具体方法:

1、获取由FactoryBean创建的具体bean实例:

// 通过工厂类的名称获取
MyBean myBean = (MyBean) SpringContextHolder.getApplicationContext().getBean("myFactoryBean");
// 通过Bean类型获取(如果你有多个工厂,都生产MyBean,请不要使用MyBean.class获取,它会同时执行你的多个工厂类)
MyBean myBean = SpringContextHolder.getApplicationContext().getBean(MyBean.class);

2、获取产生Bean实例的具体工厂类FactoryBean自身的实例: 如果你想直接操作FactoryBean(例如,进行一些配置调整),你可以通过在bean名称前加上&作为前缀来获取FactoryBean的实例,这是 Spring 内置的命名规则:

// 通过工厂类的名称和&符号获取
MyFactoryBean factoryBean = (MyFactoryBean) SpringContextHolder.getApplicationContext().getBean("&myFactoryBean");
// 通过工厂类class
MyFactoryBean factoryBean = SpringContextHolder.getApplicationContext().getBean(MyFactoryBean.class);

单例和多实例

通过重写方法 isSingleton() 控制返回值来决定该工厂类每次都返回一个实例,还是每次都返回单例的bean(默认值是 true,单实例模式)。
注意:工厂类自身还是单例的,我们一般我们不会为工厂类设置 prototype,只是在需要的时候重写 isSingleton() 方法返回 false 来实现多例。

结论

通过上述步骤,我们不仅能够轻松地从Spring容器中获取由FactoryBean创建的bean实例,还能获取到这个FactoryBean的实例本身。这种灵活性使得FactoryBean成为了处理复杂bean创建逻辑的强大工具。无论你是需要定制化bean的创建过程,还是希望对bean的生命周期有更精细的控制,FactoryBean都能满足你的需求。

通过这种方式,开发者可以更加灵活地管理和操作Spring中的bean实例,提高代码的可维护性和扩展性。希望这篇文章能帮助你更好地理解和应用FactoryBean。


(END)


http://www.mrgr.cn/news/95167.html

相关文章:

  • SpringBoot 第二课(Ⅰ) 整合springmvc(详解)
  • 备赛蓝桥杯之第十六届模拟赛3期职业院校组
  • ffmpeg库视频硬解码使用流程
  • C语言每日一练——day_8
  • 【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
  • Linux驱动学习笔记(四)
  • ffmpeg库视频硬编码使用流程
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-6.2uboot启动流程-lowlevel_init,s_init,_main函数执行
  • mysql-innodb存储引擎主键索引叶子结点数据结构(非单纯的双向链表)
  • atop命令介绍(全面资源监控:同时监控CPU、内存、磁盘、网络和进程活动)性能监控、资源数据
  • 前端iView面试题及参考答案
  • 分布式数据库系统(DDBS)
  • Java 大视界 -- Java 大数据在智能体育赛事直播数据分析与观众互动优化中的应用(142)
  • UE4学习笔记 FPS游戏制作7 敌人的自动寻路
  • openEuler24.03 LTS下安装Hadoop3完全分布式
  • git clone, 算是解决可以访问github但无法clone的问题
  • LeetCode 30 —— 30.串联所有单词的子串
  • 【C#】Winform调用NModbus实现Modbus TCP 主站通讯
  • Python、MATLAB和PPT完成数学建模竞赛中的地图绘制
  • 【JavaEE】网络编程socket