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

spring 学习(工厂方式 实例化对象(静态工厂,实例化工厂,实现factorybean 规范))

目录

前言

第一种:静态工厂方式实例化对象

静态工厂的特点

demo(案例)

第二种:实例工厂的方式

实例工厂和静态工厂的区别

demo(案例)

第三种:实现FactoryBean规范的方式

demo(案例)


前言

spring 实例化对象的几种方式

  • 使用 构造方法实例化对象  spring学习(spring-bean实例化(无参构造与有参构造方法实现)详解)-CSDN博客
  •  工厂方式创建对象。

工厂方式实例化对象又可以分为三种情况:

一种是静态工厂;另一种是实例工厂;还有一种实现FactoryBean方式;下面我们就这三种方式分别实现一下。

准备工作 :导入 spring-context 依赖

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency>

第一种:静态工厂方式实例化对象

静态工厂的特点

通过属性factory-method来指定一个静态方法,在该静态方法中达到创建对象的目标并返回交给spring容器管理。

demo(案例)

在 IDEA 新建两个类 学生 类,老师类,当前使用 静态工厂方式 创建 学生类对象

根据是否提前在 目标类 写静态方法 有两者写法

  •  先在目标类中 写好 静态方法

spring 配置文件 中

Test 测试类

运行结果

 注意:factory -method 属性值 是 你添加的静态方法名。如果你事先没有确定好静态方法,可以根据提示自定义方法名,创建在目标类中


  • 先不在目标类中添加静态方法,而是在配置文件中 自定义 静态方法名,之后再目标类中完善方法

根据提示自定义方法名,自动创建在目标类中

重新运行结果是一样的

现在有一个问题 ,使用 学生类的静态方法,创建老师类对象 是否可行呢?

在 Test 测试类中

运行结果

发现,确实可以 创建 老师类对象。

在测试类,我想要获得是 学生类对象,但因为我在 学生类的添加的静态方法中,返回老师对象,最终结果打印的也是老师对象的地址。这个情况,我们常常戏称为 狸猫换太子

具体的底层代码细节如下

通过这个现象 思考几个问题

  • 1 学生类对象 创建了没有

观察

1 spring 配置文件是否有表示学生信息的bean 标签

2 静态方法中是否有通过new 关键字创建对象

  • 2 老师 类对象 有没有交给 spring 容器 管理

我认为 老师类 对象有spring 容器的参与,但实际上创建还是 new 出来的。

看下一个知识点: 实例化工厂 创建

总结 静态工厂 实例化对象

总结:采用静态工厂的方式去实例化对象,只需要在bean标签中指定一个静态方法即可,用factory-method属性来指定,方法名自已取,反正由idea自动帮我们创建好。然后我们只需要在创建好的静态方法中返回一个对象就搞定了。


第二种:实例工厂的方式

实例工厂和静态工厂的区别

  • 实例工厂的方式,是在静态工厂的基础上在sping 配置文件 中 添加一个 factory-bean 属性,并实现真正目标类的方法

  • 实例工厂创建对象 需要非静态方法,并且该方法是存在真正的创建对象的类中


demo(案例)

当前有 Ball ,Fruit 类 ,使用实例化工厂方式 创建 Ball 类对象

spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用静态工厂创建对象--><bean id="student" class="fs.exerise01.Student" factory-method="getObject"/>
<!--    实例工厂创建对象--><bean id="ball" class="fs.exerise02.Ball "></bean><bean id="fruit" class="fs.exerise02.Fruit" factory-method="getObject"  factory-bean="ball"></bean></beans>

发现 factory-bean 的属性值 和 把目标对象交给 容器生产的 唯一标识符 id 的值是息息相关

从上面的图片可以知道:

是spring 容器通过构造方法创建 Ball 类对象,后对象调用在Ball 类的getObject 方法来创建真正需要的目标对象


Ball 类代码

package fs.exerise02;public class Ball {public Ball getObject() {return new Ball();}
}

Test测试类代码

package fs.exerise02;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Object bean = context.getBean("fruit");System.out.println(bean);}
}

运行结果

发现 表面上通过 getbean方法 获得 fruit 类对象方法,但实际是通过 实例化工厂方式创建ball类对象。真正做到了 移花接木的效果。

同样的道理,我们只需要修改Ball 类中的方法,可以任意创建目标对象?

如 之前在Ball 类中创建ball类对象。现在创建 fruit 类对象

其他的地方,一律不变!

运行结果

实例化工厂创建对象总结

1 使用实例化工厂创建对象,factory-bean 的属性值 表示真正调用本类的factory-method 属性值表示的方法

2 在本类方法中,我们可以修改方法,来实现任意对象的创建


第三种:实现FactoryBean规范的方式

demo(案例)

了解

Demo3 是 FactoryBean 接口的实现类,并重写  getObject 返回目标对象,getObjectType  返回 目标类的字节码文件,最终实现 Ball 类对象的创建

Demo3 类代码

package fs.exerise03;import fs.exerise02.Ball;
import org.springframework.beans.factory.FactoryBean;public class User implements FactoryBean<Ball> {// 返回一个Ball对象@Overridepublic Ball getObject() throws Exception {return new Ball();}
/// 返回Ball.class@Overridepublic Class<?> getObjectType() {return Ball.class;}
}

Test 测试类


package fs.exerise03;import fs.exerise02.Ball;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Ball demo3 = (Ball)context.getBean("user");System.out.println(demo3.getObject());}}

运行结果

相关文章:

spring 学习(工厂方式 实例化对象(静态工厂,实例化工厂,实现factorybean 规范))

目录 前言 第一种&#xff1a;静态工厂方式实例化对象 静态工厂的特点 demo(案例&#xff09; 第二种&#xff1a;实例工厂的方式 实例工厂和静态工厂的区别 demo(案例&#xff09; 第三种&#xff1a;实现FactoryBean规范的方式 demo(案例&#xff09; 前言 spring 实…...

MarkupLM:用于视觉丰富文档理解的文本和标记语言预训练

摘要 结合文本、布局和图像的多模态预训练在视觉丰富文档理解&#xff08;VRDU&#xff09;领域取得了显著进展&#xff0c;尤其是对于固定布局文档&#xff08;如扫描文档图像&#xff09;。然而&#xff0c;仍然有大量的数字文档&#xff0c;其布局信息不是固定的&#xff0…...

讯飞智作 AI 配音技术浅析(三):自然语言处理

自然语言处理&#xff08;NLP&#xff09;是讯飞智作 AI 配音技术的重要组成部分&#xff0c;负责将输入的文本转换为机器可理解的格式&#xff0c;并提取出文本的语义和情感信息&#xff0c;以便生成自然、富有表现力的语音。 一、基本原理 讯飞智作 AI 配音的 NLP 技术主要包…...

kafka服务端之日志存储

文章目录 日志布局日志索引日志清理日志删除基于时间基千日志大小基于日志起始偏移量 日志压缩总结 日志布局 Ka饮a 中的消息是以主题为基本单位进行归类的&#xff0c; 各个主题在逻辑 上相互独立。 每个主题又可以分为一个或多个分区&#xff0c; 分区的数量可以在主题创建的…...

软件工程的熵减:AI如何降低系统复杂度

软件开发的世界&#xff0c;如同一个不断膨胀的宇宙。随着功能的增加和时间的推移&#xff0c;代码库越来越庞大&#xff0c;系统复杂度也随之水涨船高。代码膨胀、维护困难、开发效率低下等问题困扰着无数开发者。这不禁让人联想到物理学中的“熵增”原理——一个孤立系统的熵…...

模拟开发小鹅通首页网站练习

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小鹅通-首页</title><!-- 引入页…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数

声明 ngx_strerror 函数声明在 ngx_errno.h 中&#xff1a; u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); 实现 在 ngx_errno.c 中&#xff1a; u_char * ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) {size_t len;const char *ms…...

第26场蓝桥入门赛

5.扑克较量【算法赛】 - 蓝桥云课 C&#xff1a; #include <iostream> #include <algorithm> using namespace std;int a[100005];int main() {int n,k;cin>>n>>k;for (int i1; i<n; i)cin>>a[i], a[i] % k;sort(a1, a1n);int mx a[1]k-a…...

【CAPL实战】实现弹窗提示及操作

文章目录 前言1、TestWaitForTesterConfirmation函数2、测试举例 前言 在使用CANoe进行车载通信测试的过程中&#xff0c;可能因为一些条件限制&#xff0c;我们需要在测试执行的过程中去观察一些硬件显示或者调整相关硬件状态。比如测试过程中&#xff0c;需要手动去调整小电…...

基于ESP32的远程开关灯控制(ESP32+舵机+Android+物联网云平台)

目录 材料环境准备物理材料软件环境 物联网平台配置&#xff08;MQTT&#xff09;MQTT阿里云平台配置创建产品添加设备自定义topic esp32配置接线代码 Android部分和云平台数据流转 前言&#xff1a;出租屋、宿舍网上关灯问题&#xff0c;计划弄一个智能开关以及带一点安防能力…...

协议-ACLLite-ffmpeg

是什么&#xff1f; FFmpeg是一个开源的多媒体处理工具包&#xff0c;它集成了多种功能&#xff0c;包括音视频的录制、转换和流式传输处理。FFmpeg由一系列的库和工具组成&#xff0c;其中最核心的是libavcodec和libavformat库。 libavcodec是一个领先的音频/视频编解码器库&…...

ARM嵌入式学习--第十四天(SPI)

SPI -介绍 SPI&#xff08;Serial Peripheral Interface&#xff09;串行外围设备接口。是由Motorola公司开发&#xff0c;用来在微控制器和外围设备芯片之间提供一个低成本&#xff0c;易使用的接口。这样接口可以用来连接存储器、AD转换器、DA转换器、实时时钟、LCD驱动器、…...

DeepSeek-V2 论文解读:混合专家架构的新突破

论文链接&#xff1a;DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model 目录 一、引言二、模型架构&#xff08;一&#xff09;多头部潜在注意力&#xff08;MLA&#xff09;&#xff1a;重塑推理效率&#xff08;二&#xff09;DeepSeekM…...

5分钟了解回归测试

1. 什么是回归测试&#xff08;Regression Testing&#xff09; 回归测试是一个系统的质量控制过程&#xff0c;用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响&#xff08;比如你在家中安装了新的空调系统&#xff0c;发现虽然新的空…...

路由器如何进行数据包转发?

路由器进行数据包转发的过程是网络通信的核心之一&#xff0c;主要涉及以下几个步骤&#xff1a; 接收数据包&#xff1a;当一个数据包到达路由器的一个接口时&#xff0c;它首先被暂时存储在该接口的缓冲区中。 解析目标地址&#xff1a;路由器会检查数据包中的目标IP地址。…...

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...

iOS 自动翻滚广告条(榜单条)实现方案

引言 在直播场景中&#xff0c;榜单信息、活动公告或者广告推广通常需要以醒目的方式展示&#xff0c;但由于屏幕空间有限&#xff0c;一次只能显示一条内容。为了让用户能够持续关注这些信息&#xff0c;我们可以实现一个自动翻滚的广告条&#xff08;或榜单条&#xff09;&a…...

TensorFlow深度学习实战(7)——分类任务详解

TensorFlow深度学习实战&#xff08;7&#xff09;——分类任务详解 0. 前言1. 分类任务1.1 分类任务简介1.2 分类与回归的区别 2. 逻辑回归3. 使用 TensorFlow 实现逻辑回归小结系列链接 0. 前言 分类任务 (Classification Task) 是机器学习中的一种监督学习问题&#xff0c;…...

动态规划问题——青蛙跳台阶案例分析

问题描述&#xff1a; 一只青蛙要跳上n级台阶&#xff0c;它每次可以跳 1级或者2级。问&#xff1a;青蛙有多少种不同的跳法可以跳完这些台阶&#xff1f; 举个例子&#xff1a; 假设台阶数 n 3 &#xff0c;我们来看看青蛙有多少种跳法。 可能的跳法&#xff1a; 1. 跳1级…...

element-ui使用el-table,保留字段前的空白

项目名称项目编号1、XXXXX1111111111111111111 1.1 XXXXX11111111111111222222222 如上表格中&#xff0c;实现项目名称字段1.1前空白的效果。 从JAVA返回的数据带有空白&#xff0c;即数据库中插入的数据带有空白。 原先写法&#xff1a; <el-table><el-tabl…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...