Spring创建复杂对象

目录

一、什么是复杂对象

二、创建复杂对象的3种方式

2.1 实现FactoryBean接口

2.1.1 普通的创建方式

2.1.1 依赖注入的方式

2.1.3 FactoryBean的工作原理

2.2 实例工厂

2.3 静态工厂


一、什么是复杂对象

书接上回,我们已经分析了Spring是怎么去创建对象的了。那什么是简单对象什么又是复杂对象呢?那简单对象又要怎么去创建呢?

  • 简单对象:能够直接通过new构造方法创建的对象,称为是简单对象
  • 复杂对象:不能通过直接new构造方法创建的对象,称为是复杂对象,例如数据库连接操作的中的Connection对象等

二、创建复杂对象的3种方式

2.1 实现FactoryBean接口

2.1.1 普通的创建方式

1)这里用数据库连接的操作代码为例,首先需要创建一个类用于返回数据库的连接对象,这个类实现了Spring中的FactoryBean的接口(实现这个类当然就需要去重写该类中的方法)

  • 首先返回什么什么对象就在泛型中写该类的对象
  • 第一个方法用于书写创建复杂对象的代码
  • 第二个方法用于返回这个复杂对象的class对象
  • 第三个方法是告知Spring创建的对象是否是单例的  
public class ConnectionFactoryBean implements FactoryBean<Connection> {@Overridepublic Connection getObject() throws Exception {// 用于创建复杂对象的代码// 创建数据库的连接对象Class.forName("com.mysql.jdbc.Driver");Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","123456");// 创建好了对象之后将这个对象返回return conn;}@Overridepublic Class<?> getObjectType() {// 用于返回创建的复杂对象的class对象return Connection.class;}@Overridepublic boolean isSingleton() {return false;}
}

2) 通过Spring的配置文件获取复杂对象。这里需要注意的是,这里通过bean标签获取到的对象和之前写过的配置文件有所不同了,之前这个class属性中对应的是哪个类获取到的就是哪个类的对象,但是在实现了FactoryBean接口的类中这里获取到的对象是创建的复杂对象(后面详说)

<bean id="connection" class="com.gl.demo.factory.ConnectionFactoryBean"/>

3) 接下来进行测试,这里如果成功打印则说明拿到的确实是Connection对象而不是ConnectionFactoryBean对象,通过测试可以发现获取到的对象就是Connection对象

@Test
public void test5() {ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");Connection conn = (Connection) ctx.getBean("connection");System.out.println("conn = "+conn);
}

4)如果只是想获取ConnectionFactoryBean对象呢?这也是可以解决的,在getBean方法的参数中加上&符号即可,此时获取到的就是ConnectionFactoryBean对象了

public void test6() {ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");ConnectionFactoryBean conn = (ConnectionFactoryBean) ctx.getBean("&connection");System.out.println("conn = "+conn);
}

2.1.1 依赖注入的方式

通过上述方式成功的获取到了复杂对象,但是这里细心一点就会发现,如果我的数据库更换了,或者这里的密码也更换了呢?那就需要去修改代码,那是不是就耦合了?耦合了怎么解决呢?是不是就可以利用前面所说的依赖注入解决啊!接下来修改代码

public class ConnectionFactoryBean implements FactoryBean<Connection> {private String driveClassName;private String url;private String username;private String password;public void setDriveClassName(String driveClassName) {this.driveClassName = driveClassName;}public void setUrl(String url) {this.url = url;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic Connection getObject() throws Exception {// 用于创建复杂对象的代码// 创建数据库的连接对象Class.forName(driveClassName);Connection conn =DriverManager.getConnection(url,username,password);// 创建好了对象之后将这个对象返回return conn;}@Overridepublic Class<?> getObjectType() {// 用于返回创建的复杂对象的class对象return Connection.class;}@Overridepublic boolean isSingleton() {return false;}
}
<bean id="connection" class="com.gl.demo.factory.ConnectionFactoryBean"><property name="driveClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/>
</bean>

2.1.3 FactoryBean的工作原理

其实这里的核心就是一个接口回调。当我们通过getBean方法去获取这个连接对象的时候,Spring首先会通过instanceof方法去判断是不是实现了FactoryBean类,如果是的话Spring就会调用getObject方法返回连接对象,这也就是前面所说的为什么返回的不是ConnectionFactoryBean对象而是Connection对象。

2.2 实例工厂

这里可能就会有疑问了,为什么有了创建复杂对象的方式还要学这个实例工厂的方式呢?这是因为在写项目的过程中可能这个连接对象已经创建好了,我们只要去使用就行了。好,那我直接将这个代码实现FactoryBean接口不就可以了吗?其实这里你也不确定能不能拿到源码文件,如果是class文件呢?这也就是学习实例工厂的原因

1)假设这里已经有了连接对象的class文件,当然这里是有耦合的,但是为了演示简洁就不在写配置文件了,大家知道即可

public class ConnectionFactory {public Connection getConnection() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","123456");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}
}

2)有了这个类之后是不是就需要获取到这个类对象,然后再通过这个类对象调用getConnection方法。但是如果通过getBean方法获取再调用就显得麻烦,这里就可以通过使用实例工厂进行整合。这里引出两个标签属性一个是factory-bean表示整合哪个类,另一个factory-method表示类中的哪个方法。

<bean id="connFactory" class="com.gl.demo.factory.ConnectionFactory"/>
<bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>

 

2.3 静态工厂

这里的静态工厂其实与实例工厂是差不多的,只是方法是静态的,所以和实例工厂只有细微的区别

public class StaticConnectionFactory {public static Connection getConnection() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","123456");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}
}

静态的方法可以通过类直接调用,那这个配置文件的写法也就明确了,直接在这个类对象中写上factory-method即可

<bean id="conn1" class="com.gl.demo.factory.StaticConnectionFactory" factory-method="getConnection"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/164994.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springweb+vue前后端分离开发,集成部署

背景&#xff1a; 在自己做测试的时候&#xff0c;由于需要项目和项目的前端页面使用同样接口访问&#xff0c;所以需要将前端代码部署到后端项目下。前端采用vue&#xff0c;后端采用springboot。 首先时建立一个vue项目&#xff0c;这个可以参照网上的案例&#xff0c;创建方…

AI绘画使用Stable Diffusion(SDXL)绘制中国古代神兽

一、引言 说到神奇异兽&#xff0c;脑海中首先就会跳出我国古代神话传说中的各种神兽。比如青龙、白虎、朱雀、玄武&#xff0c;再比如麒麟、凤凰、毕方、饕餮等等&#xff0c;这些都是大家耳熟能详的的神兽。 这些神兽不仅体现了人们丰富的创造力和想象力&#xff0c;更是我…

一次说全COLA应用架构

一&#xff0c;为什么需要好的应用架构 上图比较清晰地说明了好的应用架构的作用——去繁为简&#xff0c;化无序为有序。 二&#xff0c;关于COLA的几种定义 1&#xff0c;原版 GitHub - alibaba/COLA: &#x1f964; COLA: Clean Object-oriented & Layered Architec…

【大数据】Kafka 数据存储

Kafka 数据存储 1.文件目录2.日志分段3.日志索引3.1 偏移量索引3.2 时间戳索引 4.日志清理4.1 日志删除4.1.1 基于时间4.1.2 基于日志大小4.1.3 基于日志起始偏移量 4.2 日志压缩 1.文件目录 Kafka 中的消息是存储在磁盘上的&#xff0c;一个分区副本对应一个 日志&#xff08…

异常数据检测 | Python基于Hampel的离群点检测

文章目录 文章概述模型描述源码分享文章概述 在时间序列数据分析领域,识别和处理异常点是至关重要的任务。异常点或离群点是明显偏离预期模式的数据点,可能表明存在错误、欺诈或有价值的见解。 应对这一挑战的一种有效技术是汉普尔过滤器(Hampel Filter)。 模型描述 汉…

OpenCV实现物体尺寸的测量

一 &#xff0c;项目分析 物体尺寸测量的思路是找一个确定尺寸的物体作为参照物&#xff0c;根据已知的计算未知物体尺寸。 如下图所示&#xff0c;绿色的板子尺寸为220*300&#xff08;单位&#xff1a;毫米&#xff09;&#xff0c;通过程序计算白色纸片的长度。 主要是通过…

2023区块链国赛有黑幕

2023全国职业院校技能大赛区块链技术应用赛项 有黑幕&#xff01;&#xff01;河北软件职业技术学院举行的全国职业院校技能大赛区块链技术应用赛项违反比赛公平原则&#xff1a; 1、在评分阶段居然允许企业人员进入裁判所在区域&#xff0c;偏向性的引导裁判评分&#xff0c…

小程序实现后台数据交互及WXS的使用

一&#xff0c;数据交互准备工作 1.1 后端准备 后端部分代码&#xff0c;可自行创建后端代码 package com.zking.minoa.wxcontroller;import com.zking.minoa.mapper.InfoMapper; import com.zking.minoa.model.Info; import com.zking.minoa.util.ResponseUtil; import org…

从入门到进阶 之 ElasticSearch 配置优化篇

&#x1f339; 以上分享从入门到进阶 之 ElasticSearch 配置优化篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏…

ant design vue Message 用法以及内容为 html片段情况

ant design vue 的 Message 用法 全局展示操作反馈信息 何时使用 # 可提供成功、警告和错误等反馈信息。顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 全局配置&#xff1a; // main.ts// 进行全局配置 message.config({top: 0.7rem,//高度…

nvm管理不同版本nodejs

文章目录 nvm下载卸载本地node安装nvm安装nodejsnvm查看已安装版本nvm切换nodejs版本nvm删除nodejs版本 nvm下载 nvm github下载链接 nvm 1.1.7-setup.zip&#xff1a;安装版&#xff0c;推荐使用 卸载本地node 打开cmd where node 找到上面找到的路径&#xff0c;将node.…

【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力

在科技发展的驱动下&#xff0c;AR&#xff08;增强现实&#xff09;技术已经在许多领域中找到了应用&#xff0c;包括医疗、教育、建筑和娱乐等。然而&#xff0c;有一个领域尚未充分利用AR技术的潜力&#xff0c;那就是野外地质调查。通过将AR技术引入到这个传统上需要大量人…

基于nodejs+vue中学信息技术线上学习系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

如何使用visual studio 2010构建SQLite3.lib文件

sqlite3官网只提供了dll&#xff0c;并没有lib文件。需要自己生成sqlite3.lib。因项目升级到x64&#xff0c;以前并没有生成64位的链接库&#xff0c;需要自己创建。本人电脑操作系统windows 10, 开发环境为visual studio 2010。下面是详细生成过程。 1. 从源下载源&#xff08…

低代码助力软件开发

低代码开发工具正在日益变得强大&#xff0c;它正不断弥合着前后端开发之间的差距。对于后端来说&#xff0c;基于低代码平台开发应用时&#xff0c;完全不用担心前端的打包、部署等问题&#xff0c;也不用学习各种框架&#xff08;Vue、React、Angular等等&#xff09;&#x…

深入探究音视频开源库 WebRTC 中 NetEQ 音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、什么是NetEQ&#xff1f; 3、NetEQ技术详解 3.1、NetEQ概述 3.2、抖动消除技术 3.3、丢包补偿技术 3.4、NetEQ概要设计 3.5、NetEQ的命令机制 3.6、NetEQ的播放机制 3.7、MCU的控制机制 3.8、DSP的算法处理 3.9、DSP算法的模拟测试 4、NetEQ源文件…

PHP 基础/练习

练习 成绩定级 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>成绩定级脚本</title> </…

三网话费余额查询的API系统 基于thinkphp6.0框架

本套系统是用thinkphp6.0框架开发的&#xff0c;PHP需大于8.2&#xff0c;系统支持用户中心在线查询和通过API接口对接发起查询&#xff0c;用户余额充值是对接usdt接口&#xff0c;源码全开源&#xff0c;支持懂技术的人二次开发~搭建教程1、源码上传后&#xff0c;吧运行目录…

Linux性能优化--补充

14.1. 性能工具的位置 本书描述的性能工具来源于Internet上许多不同的位置。幸运的是&#xff0c;大多数主要发行版都把它们放在一起&#xff0c;包含在了其发行版的当前版本中。表A-1描述了全部工具&#xff0c;提供了指向其原始源位置的地址&#xff0c;并注明它们是否包含在…

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

本文目录 前言Step 1 前置工作Step 2 导出相应数据 前言 MIKE的模拟结果dfsu文件的数据是可以导出的&#xff0c;导出格式为xyz&#xff0c;我们也可以将其改后缀改为txt文本格式&#xff0c;其中包含了某一时刻下所有网格坐标点的数据。 Step 1 前置工作 首先&#xff0c;在…