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

Spring工厂方式实现实例化bean有哪些方式?

在Spring框架中,实例化Bean的方式有多种,其中通过工厂方法(Factory Method)来创建Bean是一种常见的方式。这种方式允许你通过自定义的工厂类或静态方法来生成Bean实例,从而提供了更灵活和复杂的实例化逻辑。

以下是Spring中通过工厂方法实例化Bean的几种方式及其代码实现:

1. 使用静态工厂方法

你可以通过指定一个包含静态方法的类,以及该方法来创建Bean。在Spring的配置文件(XML)或Java配置类中,你需要使用<bean>元素的factory-method属性来指定静态工厂方法。

示例代码:

静态工厂类

public class MyBeanFactory {  public static MyBean createMyBean() {  return new MyBean();  }  
}

Spring XML配置

<bean id="myBean" class="com.example.MyBeanFactory" factory-method="createMyBean"/>

或者,在Java配置类中:

@Configuration  
public class AppConfig {  @Bean  public MyBean myBean() {  return MyBeanFactory.createMyBean();  }  
}
但是注意,在Java配置类中,你通常不会直接使用factory-method属性,而是直接调用静态工厂方法并返回Bean实例。

2. 使用实例工厂方法

对于非静态的工厂方法,你需要首先创建一个工厂类的实例,然后调用该实例上的方法来创建Bean。在Spring的配置文件中,你需要使用<bean>元素的factory-beanfactory-method属性来指定工厂Bean和工厂方法。

示例代码:工厂类Spring XML配置
<bean id="myBeanFactory" class="com.example.MyBeanFactory"/>  
<bean id="myBean" factory-bean="myBeanFactory" factory-method="createMyBean"/>

在Java配置类中,你可以这样做:

@Configuration  
public class AppConfig {  @Bean  public MyBeanFactory myBeanFactory() {  return new MyBeanFactory();  }  @Bean  public MyBean myBean(MyBeanFactory myBeanFactory) {  return myBeanFactory.createMyBean();  }  
}

但是,请注意,在Java配置类中,你通常会直接调用工厂实例的方法,而不是通过Spring的factory-beanfactory-method属性,因为这种方式更直接且易于理解。

3 实现FactoryBean接口

在Spring框架中,FactoryBean 是一个接口,它允许你自定义对象的创建过程。通过使用 FactoryBean,你可以返回一个不同类型的对象实例,而不是直接返回在 Spring 配置文件中定义的 bean 类型的实例。这在某些场景下非常有用,比如当你需要返回一个代理对象、一个复杂对象的实例、或者当你希望延迟初始化对象时。 

示例代码:
import org.springframework.beans.factory.FactoryBean;  public class MyFactoryBean implements FactoryBean<MyService> {  @Override  public MyService getObject() throws Exception {  // 这里可以创建并返回 MyService 的实例  return new MyServiceImpl();  }  @Override  public Class<?> getObjectType() {  // 返回 MyService 的 Class 对象  return MyService.class;  }  @Override  public boolean isSingleton() {  // 指定返回的实例是否是单例  return true;  }  
}

在这个例子中,MyFactoryBean 创建并返回一个 MyService 类型的实例。

3.1. 配置 FactoryBean

接下来,你需要在 Spring 配置文件中注册这个 FactoryBean。你可以通过 XML 配置或 Java 配置来实现。

XML 配置

<bean id="myFactoryBean" class="com.example.MyFactoryBean"/>

Java 配置

3.2. 使用 FactoryBean 创建的 Bean

在 Spring 应用中,你可以通过 ApplicationContext 来获取由 FactoryBean 创建的 bean。

import org.springframework.context.ApplicationContext;  
import org.springframework.context.annotation.AnnotationConfigApplicationContext;  public class MainApp {  public static void main(String[] args) {  ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);  // 通过 FactoryBean 获取 MyService 实例  MyService myService = (MyService) context.getBean("myFactoryBean");  // 使用 myService  myService.doSomething();  }  
}

注意,当你通过 context.getBean("myFactoryBean") 获取 bean 时,你实际上获取的是 FactoryBean 创建的对象实例,而不是 FactoryBean 本身。

3.3. 获取 FactoryBean 本身

如果你确实需要获取 FactoryBean 本身,而不是它创建的对象,你可以在 bean 名称后加上 & 符号:

MyFactoryBean myFactoryBean = (MyFactoryBean) context.getBean("&myFactoryBean");

这样,你就可以访问 FactoryBean 实例本身,而不是它创建的对象。

相关文章:

Spring工厂方式实现实例化bean有哪些方式?

在Spring框架中&#xff0c;实例化Bean的方式有多种&#xff0c;其中通过工厂方法&#xff08;Factory Method&#xff09;来创建Bean是一种常见的方式。这种方式允许你通过自定义的工厂类或静态方法来生成Bean实例&#xff0c;从而提供了更灵活和复杂的实例化逻辑。 以下是Sp…...

衡石分析平台系统分析人员手册-指标分析看板

指标分析看板为业务指标量身打造的分析看板。拖拽指标就可形成看板&#xff0c;通过点选对指标分析图表进行配置&#xff0c;整个过程简单易上手。分析人员根据业务分析场景制作图表&#xff0c;无需对指标的数据进行再次加工处理。 指标分析是为业务指标定制的看板&#xff0…...

《C++17 结构化绑定:解锁不同类型处理的秘籍》

在 C17 中&#xff0c;结构化绑定是一个强大且引人注目的特性。它为开发者处理复杂的数据结构和多种类型的返回值提供了一种简洁而高效的方式。然而&#xff0c;正确处理不同类型的绑定和初始化问题是充分发挥这一特性优势的关键。 理解结构化绑定的本质 结构化绑定允许我们使…...

大型音频模型:AudioLLMs

大型音频模型&#xff08;Large Audio Models&#xff0c;简称AudioLLMs&#xff09;是近年来人工智能领域的一个重要研究方向&#xff0c;它们基于深度学习和大模型架构&#xff0c;能够处理和理解复杂的音频数据。以下是对大型音频模型的研究综述&#xff1a; 1. 引言 随着…...

【ShuQiHere】️理解Python中的相对路径:使用 `..` 和 `.` 的指南

【ShuQiHere】️&#x1f31f; 目录 引言什么是相对路径&#xff1f;路径中使用 . 和 ..相对路径的示例使用子文件夹中的数据使用相对路径的最佳实践结论进一步探索 引言 &#x1f30d; 在Python编程中&#xff0c;处理文件时了解如何使用相对路径至关重要。相对路径使我们…...

DMFLDR数据载入使用实践

1、DMFLDR概述 1.1DMFLDR功能介绍 dmfldr&#xff08;DM Fast Loader&#xff09;是 DM 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式 排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中&#xff0c;或把 DM 数据库中的数据按照一定格…...

发布 NPM 包时,终端显示发布成功但实际上版本并没有更新,可能是由于以下原因

如果发布仍然没有生效&#xff0c;可以检查以下几点&#xff1a; 版本号是否更新&#xff1a; 如果版本号没有更新&#xff0c;NPM 会拒绝发布新的包版本。运行以下命令以确保版本号增加了&#xff1a; bash 复制代码 npm version patch # 更新小版本号 正确的 NPM 注册表&a…...

Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)

1.微服务入门 (1).单体架构与分布式架构 单体架构&#xff1a; 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署优点&#xff1a; 架构简单、部署成本低 &#xff1b; 缺点&#xff1a; 耦合度高项目打包部署到Tomcat&#xff0c;用户直接访问。用户量增加后…...

物联网开发教程专栏介绍与专栏说明——列表目录查阅(持续更新)

阿齐Archie《物联网开发&#xff1a;完整实现单片机通信模组云服务器智能应用软件》专栏 为方便查阅学习本专栏&#xff0c;特整理专栏介绍与专栏说明 一、专栏介绍 物联网开发教程专栏目前有P1和P2系列&#xff0c;P1系列为《手把手完整实现STM32ESP8266MQTT阿里云APP应用》…...

uni-app实现app展示进度条在线更新以及定时更新提醒

需求&#xff1a;需要在app启动后进行检查更新&#xff0c;如果有更新就提示更新&#xff0c;可以点击确定更新或者暂时不更新&#xff0c;如果不更新&#xff0c;就将当前的时间进行缓存&#xff0c;并且再次进入时进行对比&#xff0c;只要超过一天时间就继续提醒检查更新 第…...

【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年11月2日 命名管道&#xff1a; 如果我们想在不相关的进程之间交换数据&#xff0c;可以使用FIFO文件来做这项工作&#xff0c;它经常被称为命名管道。命名管道是一种特殊类型的文…...

[Android]从FLAG_SECURE禁止截屏看surface

在应用中&#xff0c;设置activity的flag为FLAG_SECURE就可以禁止截屏&#xff0c;截屏出来是黑色的&#xff0c; 试验一下&#xff0c; 注意事项 影响&#xff1a; 设置 FLAG_SECURE 标志后&#xff0c;用户将无法对该Activity进行截屏或录制屏幕。这个标志会影响所有屏幕录…...

python 五子棋小游戏

1. 实现效果 Python五子棋小游戏 2. 游戏规则 规则说明&#xff0c;五子棋人机对战游戏规则如下&#xff1a;‌ Ⅰ 默认规则 - 五子棋规则 对局双方‌&#xff1a;各执一色棋子&#xff0c;一方持黑色棋子&#xff0c;另一方持白色棋子。棋盘与开局‌&#xff1a;空棋盘开局…...

JeecgBoot集成工作流实战教程

Activiti是一个轻量级的工作流程和业务流程管理&#xff08;BPM&#xff09;平台&#xff0c;它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的&#xff0c;并且基于Apache许可证进行分发。它可以运行在任何…...

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…...

NumPy 高级索引

NumPy 高级索引 NumPy 是 Python 中用于科学计算的核心库之一,它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。在 NumPy 中,除了基本的索引和切片操作外,还提供了高级索引功能,这使得您可以以更加灵活和高效的方式访问和操作数组中的数据。本文将详细介绍 N…...

C/C++常用编译工具链:GCC,Clang

目录 GNU Compiler Collection GCC的优势 编译产生的中间文件 Clang Clang的特点 什么是LLVM&#xff1f; Clang编译过程中产生的中间表示文件 关于Clang的调试 C 编译工具链中有几个主要的编译工具&#xff0c;包括&#xff1a; GNU Compiler Collection (GCC…...

let和war的区别

let和war的区别 看不懂图片&#xff0c;可以看视频教程...

[CUDA] stream使用笔记

文章目录 1. stream一般用法2. stream与event&#xff1a;3. stream异常的排查4. stream的异步与同步行为 1. stream一般用法 cudaStream_t stream_; cudaStreamCreate(&stream_); // create stream // some operators running on this stream_ cudaStreamSynchronize(str…...

第二课:开发工具

在本课中&#xff0c;我们将介绍一些常用的C开发工具&#xff0c;并附上下载链接&#xff0c;帮助你选择合适的工具进行开发。 1. DEVC DEVC 是一个轻量级的C开发工具&#xff0c;适合初学者使用。它提供了基本的代码编辑、编译和调试功能。 下载链接: DEVC 下载 2. Visual…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...