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

【Spring】基于XML的Spring容器配置——FactoryBean的使用

随着Spring框架应用程序的复杂性增加,开发者需要更加灵活和强大的工具来创建和管理Bean。FactoryBean是Spring提供的一种强大机制,它允许开发者自定义Bean的创建过程。这种机制不仅提高了Bean的创建灵活性,还可以简化复杂对象的构建过程。

在实际应用中,FactoryBean的使用场景非常广泛。例如,当我们需要创建一个复杂对象,或者需要在创建对象时进行一些额外的逻辑处理(如初始化、配置等),FactoryBean就显得尤为重要。通过FactoryBean,我们可以将对象的创建逻辑与业务逻辑分离,从而提高代码的可维护性和可重用性。

1. 理论知识

1.1 什么是FactoryBean

FactoryBean是Spring框架中的一个接口,允许开发者定义一个工厂类,以便创建和配置Bean。实现FactoryBean接口的类可以提供自定义的Bean实例,而不是简单地返回类的实例。

1.1.1 FactoryBean接口

FactoryBean接口定义了以下方法:

  • T getObject(): 返回一个新创建的对象(Bean)。

  • Class<?> getObjectType(): 返回所创建对象的类型。

  • boolean isSingleton(): 返回所创建对象是否是单例。

通过实现这些方法,开发者可以控制Bean的创建过程。

1.2 FactoryBean的优势
  • 灵活性:可以根据需要创建复杂对象,甚至可以返回不同类型的对象。

  • 重用性:将对象创建逻辑与业务逻辑分离,便于重用。

  • 可维护性:集中管理对象的创建和配置,减少了代码的耦合度。

2. 使用示例

2.1 创建项目结构

我们将创建一个简单的Spring项目,项目结构如下:

my-spring-app/
├── src/
│   ├── main/
│   │   ├── resources/
│   │   │   └── applicationContext.xml
│   │   └── java/
│   │       └── com/
│   │           └── example/
│   │               ├── MyApp.java
│   │               ├── CustomObject.java
│   │               └── CustomObjectFactoryBean.java
└── pom.xml
2.2 创建自定义对象

首先,我们创建一个简单的对象类CustomObject,它将由FactoryBean创建。

// CustomObject.java
package com.example;public class CustomObject {private String name;public CustomObject(String name) {this.name = name;}public String getName() {return name;}@Overridepublic String toString() {return "CustomObject{name='" + name + "'}";}
}
2.3 创建FactoryBean

接下来,我们创建一个实现FactoryBean接口的类CustomObjectFactoryBean,用于创建CustomObject实例。

// CustomObjectFactoryBean.java
package com.example;import org.springframework.beans.factory.FactoryBean;public class CustomObjectFactoryBean implements FactoryBean<CustomObject> {private String name;// Setter方法用于依赖注入public void setName(String name) {this.name = name;}@Overridepublic CustomObject getObject() throws Exception {// 创建CustomObject实例return new CustomObject(name);}@Overridepublic Class<?> getObjectType() {return CustomObject.class;}@Overridepublic boolean isSingleton() {// 返回true表示该FactoryBean返回的对象是单例return true;}
}
2.4 配置XML文件

applicationContext.xml中,我们将配置CustomObjectFactoryBean

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置FactoryBean --><bean id="customObjectFactory" class="com.example.CustomObjectFactoryBean"><property name="name" value="My Custom Object"/></bean><!-- 使用FactoryBean创建CustomObject --><bean id="customObject" factory-bean="customObjectFactory" factory-method="getObject"/>
</beans>
2.5 Java代码示例

接下来,我们创建一个简单的Java应用程序来测试我们的配置。

// MyApp.java
package com.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyApp {public static void main(String[] args) {// 加载Spring上下文ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取CustomObjectCustomObject customObject = (CustomObject) context.getBean("customObject");// 输出CustomObject的信息System.out.println("Created: " + customObject);}
}

3. 运行与结果

在终端中运行MyApp类,输出结果将是:

Created: CustomObject{name='My Custom Object'}

4. 结果分析

在上述示例中,我们通过CustomObjectFactoryBean创建了一个CustomObject实例。以下是关键点的分析:

  1. 自定义对象的创建

    • CustomObjectFactoryBean实现了FactoryBean接口,定义了创建CustomObject的逻辑。通过getObject()方法返回一个新的CustomObject实例。

  2. XML配置

    • 在XML配置中,我们通过factory-beanfactory-method属性指定了使用哪个FactoryBean来创建目标Bean。这样,我们可以在Spring容器中方便地管理对象的创建。

  3. 单例管理

    • isSingleton()方法返回true,表示通过FactoryBean创建的CustomObject是单例的。每次请求customObject时,都会返回同一个实例。

5. 总结

通过上述示例,我们深入理解了Spring中FactoryBean的使用及其重要性。FactoryBean不仅提供了灵活的对象创建机制,还可以帮助我们管理复杂对象的生命周期和配置。

在实际开发中,FactoryBean的应用可以极大地提高代码的可维护性和可重用性。

相关文章:

【Spring】基于XML的Spring容器配置——FactoryBean的使用

随着Spring框架应用程序的复杂性增加&#xff0c;开发者需要更加灵活和强大的工具来创建和管理Bean。FactoryBean是Spring提供的一种强大机制&#xff0c;它允许开发者自定义Bean的创建过程。这种机制不仅提高了Bean的创建灵活性&#xff0c;还可以简化复杂对象的构建过程。 在…...

Docker使用——国内Docker的安装办法

文章目录 参考资料前言Mac安装办法Homebrew 安装1. 直接下报错2. 安装homebrew&#xff0c; 用国内镜像3. 安装Docker4. 启动docker服务5. 测试是否安装成功 参考资料 鸣谢大佬文章。 macOS系统中&#xff1a;Docker的安装&#xff1a;https://blog.csdn.net/sulia1234567890…...

电商会员门店消费数据分析

导包 import os import sqlite3 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from IPython.display import display_htmlpd.set_option(max_colwidth,200)%matplotlib inline前期准备 转义路径 # 获取Windows系统下的路…...

Vue.js 入门与进阶:打造高效的前端开发体验

Vue.js 是一款渐进式的 JavaScript 框架&#xff0c;凭借其轻量、易用、灵活的特点&#xff0c;已经成为了前端开发者的首选之一。从简单的交互到复杂的单页应用&#xff08;SPA&#xff09;&#xff0c;Vue 为开发者提供了一套高效且易于上手的工具。在本文中&#xff0c;我们…...

Java包装类型的缓存

Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128&#xff0c;127] 的相应类型的缓存数据&#xff0c;Character 创建了数值在 [0,127] 范围的缓存数据&#xff0c;Boolean 直接返回 True or Fal…...

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;采集原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...

.NET平台用C#通过字节流动态操作Excel文件

在.NET开发中&#xff0c;通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档&#xff0c;无需依赖直接的文件储存、读取操作&#xff0c;从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了…...

SpringMVC详解

文章目录 1 什么是MVC 1.1 MVC设计思想1.2 Spring MVC 2 SpringMVC快速入门3 SpringMVC处理请求 3.1 请求分类及处理方式 3.1.1 静态请求3.1.2 动态请求 3.2 处理静态请求 3.2.1 处理html文件请求3.2.2 处理图片等请求 3.3 处理动态请求 3.3.1 注解说明3.3.2 示例 3.4 常见问题…...

springboot、spring、springmvc有哪些注解

Spring Boot 常用注解 虽然Spring Boot本身并没有引入大量新的注解&#xff0c;但它基于Spring框架&#xff0c;并整合了多种技术和库&#xff0c;使得开发者可以更方便地使用Spring框架的功能。在Spring Boot项目中&#xff0c;常用的注解主要来自于Spring框架本身。 ‌Sprin…...

Apache Commons ThreadUtils 的使用与优化

Apache Commons ThreadUtils 的使用与优化 1. 问题背景 在 Java 系统中&#xff0c;跨系统接口调用通常需要高并发支持&#xff0c;尤其是线程池的合理配置至关重要。如果线程池使用不当&#xff0c;可能导致性能下降&#xff0c;线程等待或过载。 当前问题 使用了 Apache …...

重温设计模式--5、职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&am…...

下午四点半

客户的员工竟然背着公司开发报表系统&#xff0c;是在密谋什么大事吗&#xff1f; 之前去线下给客户的员工培训&#xff0c;当时我就对这个小姑娘印象很深刻&#xff0c;因为她后面加了我们的技术人员&#xff0c;问了很多问题&#xff0c;不同于从来没有用过低代码平台的人&a…...

嵌入式单片机中Flash存储器控制与实现

第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…...

loki failed to flush

loki 报错 levelerror ts2024-12-27T08:13:10.450140686Z callerflush.go:143 org_idfake msg"failed to flush" err"failed to flush chunks: store put chunk: open /data/loki/chunks/ZmFrZS85ODBmM2U3NzliODg2MjY1OjE5M2VhNDVkYTc4OjE5M2VhNDVlNDdkOjVmMjA…...

微信小程序打印生产环境日志

微信小程序打印生产环境日志 新建一个log.js文件&#xff0c;写入以下代码&#xff1a; let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...

利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展

经过多轮迭代&#xff0c;deepin 文件管理器&#xff08;dde-file-manager&#xff09;的扩展功能已经趋于稳定&#xff0c;看到越来越丰富的文管新功能&#xff0c;作为一名技术爱好者&#xff0c;也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...

JPA 基本查询(五)

JPA 查询Exists示例 JPA教程 - JPA 查询Exists示例 如果子查询返回任何行&#xff0c;则EXISTS条件返回true。 以下代码显示如何在JPQL中使用带有子查询的EXISTS运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE EXISTS " "(SELECT p FROM …...

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址&#xff1a;electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm&#xff08;socket.…...

项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战

项目报 OutOfMemoryError、GC overhead limit exceeded 问题排查以及解决思路实战 前言&#xff1a; 问题现象描述&#xff1a; 1&#xff0c;生产环境有个定时任务&#xff0c;没有初始化告警数据【告警数据量为1000多个】 2&#xff0c;其他定时任务执行正常 3&#xff0c;查…...

【计算机-显示屏灰阶测试】

硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶&#xff08;色带&#xff09;■ 对比率■■ ■ 对比度 在一个性能良好的显示器上&#xff0c;您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...

Flink的反压机制

目录 1. 什么是反压? 2. Flink 反压机制的演变 第一代:基于 TCP 的传播(Flink 1.5 之前) 第二代:基于信用制的反压(Flink 1.5+,当前版本) 3. 基于信用制的反压详解 核心组件 工作流程(对应上图) 优势 4. 如何识别和处理反压? 识别(通过 Flink Web UI) …...

Go Channel 缓冲区机制分析

Go Channel 缓冲区机制分析 在Go语言的并发编程中&#xff0c;Channel是协程间通信的核心机制之一。其缓冲区机制的设计直接影响程序的性能和稳定性。理解缓冲区的运作原理&#xff0c;能够帮助开发者更高效地利用Channel&#xff0c;避免死锁或资源浪费。本文将从缓冲区的本质…...

04_RAGFlow之知识图谱与Text2SQL

RAGFlow之知识图谱与Text2SQL&#xff1a;构建智能检索的双引擎 知识体系结构 RAGFlow技术栈 │ ├── 知识图谱层 │ ├── 实体识别与关系提取&#xff08;NER Relation Extraction&#xff09; │ ├── 图谱查询与推理&#xff08;Graph Query & Reasoning&a…...

基于Matlab的路面裂缝检测识别系统:实现精准路面“体检”

基于Matlab的路面裂缝检测识别系统设计&#xff0c;载入待识别图片&#xff0c;对目标图像进行直方图均衡化、中值滤波去噪、对比度增强、二值化处理、二值化滤波、裂缝识别、裂缝判断、裂分拼接、裂缝投影及标记等一系列操作&#xff0c;完成路面识别的准确识别 程序已调通&am…...

轻量级加密新选择:tiny-AES-c深度解析

轻量级加密新选择&#xff1a;tiny-AES-c深度解析 【免费下载链接】tiny-AES-c Small portable AES128/192/256 in C 项目地址: https://gitcode.com/gh_mirrors/ti/tiny-AES-c 在嵌入式系统与物联网设备等资源受限环境中&#xff0c;数据安全面临着独特挑战。轻量级AES…...

LIN总线‘智能调度’到底怎么玩?一个汽车雨刮案例讲透事件触发与偶发帧

LIN总线智能调度实战&#xff1a;汽车雨刮系统的动态事件处理与性能优化 雨滴敲击挡风玻璃的瞬间&#xff0c;现代汽车的智能雨刮系统已经完成了从感知到响应的全套动作。这背后是LIN总线在主从架构下对事件触发、偶发调度和诊断插入的精密协调——本文将用工程视角拆解这套机制…...

JavaScript注释的艺术:gh_mirrors/js/js教你写出自解释代码

JavaScript注释的艺术&#xff1a;gh_mirrors/js/js教你写出自解释代码 【免费下载链接】js :art: A JavaScript Quality Guide 项目地址: https://gitcode.com/gh_mirrors/js/js 在JavaScript开发中&#xff0c;注释是代码质量的重要组成部分&#xff0c;但很多开发者误…...

Vue3项目实战:CKEditor5自定义构建与插件深度集成指南

1. 为什么需要自定义CKEditor5构建 第一次在Vue3项目中使用CKEditor5时&#xff0c;我直接安装了官方提供的经典编辑器包&#xff08;ckeditor/ckeditor5-build-classic&#xff09;。但很快就发现一个问题&#xff1a;默认构建缺少很多常用功能。比如字体颜色、背景色、对齐方…...

英飞凌TC3XX时钟系统实战:从PLL配置到CCU分频的避坑指南

英飞凌TC3XX时钟系统实战&#xff1a;从PLL配置到CCU分频的避坑指南 在嵌入式系统开发中&#xff0c;时钟系统如同人体的神经系统&#xff0c;为整个芯片提供精准的时序控制和同步信号。作为英飞凌AURIX™系列中的旗舰产品&#xff0c;TC3XX微控制器凭借其高度可配置的时钟架构…...

效率革命:基于快马AI生成opencode自动化安装工具,告别手动敲命令

效率革命&#xff1a;基于快马AI生成opencode自动化安装工具&#xff0c;告别手动敲命令 最近在团队协作中&#xff0c;经常遇到新成员需要配置opencode开发环境的情况。每次看到同事手动输入一长串命令&#xff0c;还要处理各种依赖报错&#xff0c;我就想&#xff1a;能不能…...