Spring 工厂

news2024/11/25 9:35:30

目录

一、Spring 工厂创建复杂对象

1、什么是复杂对象

2、 Spring 工厂创建复杂对象的 3 种方式

(1)FactoryBean 接口

开发步骤:

细节:

FactoryBean 的实现原理[简易版]

Factory Bean 总结

(2)实例工厂

(3)静态工厂

3、Spring 工厂创建对象的总结

 二、控制 Spring 工厂创建对象的次数

1、如何控制简单对象的创建次数

2、如何控制复杂对象的创建次数

3、为什么要控制对象的创建次数


一、Spring 工厂创建复杂对象

1、什么是复杂对象

我们目前学习的都是创建的简单对象

简单对象,指的就是可以直接通过 new 构造方法来创建的对象

所以我们之前的 USerService ,Person,UserDAO 等都是简单对象

复杂对象,指的就是不能直接通过 new  构造方法创建的对象

我们之前在 JDBC 中接触过的 Connection 就是复杂对象


2、 Spring 工厂创建复杂对象的 3 种方式

(1)FactoryBean 接口

开发步骤:

1、实现 FactoryBean 接口

2、Spring 配置文件的配置

实现 FactoryBean 接口:

作为 FactoryBean 来讲,这个接口在我们创建复杂对象的时候,我们要自己定义一个类,比如:MyFactoryBean ,它要实现我们这个 FactoryBean 接口中所规定的方法

FactoryBean 中规定了三个方法来让我们实现:

1、getObject( );  用于书写创建复杂对象的代码,并把复杂对象作为方法的返回值返回

2、getObjectType( );   返回所创建复杂对象的 Class 对象

3、isSingleton( );  如果这个复杂对象只创建一次就返回 true,如果后续调用过程当中每一次调用都需要创建一个新的复杂对象时,就返回 false

Spring 配置文件的配置

<bean id="connection" class="factorybean.ConnectionFactoryBean"/>

通过这个配置,一方面我们告诉了 Spring 我们创建了一个叫做 ConnectionFactoryBean 的类,另一方面,我们也希望通过 Spring 创建这个类的对象供我们后面进行使用

这里的配置虽然和我们之前简单对象的配置是一样的,但是含义却发生了变化

如果 Class 中指定的类型,是 FactoryBean 接口的实现类,那么通过 id 值获得的是这个类所创建的复杂对象


细节:

1、如果想获得 FactoryBean 类型的对象,可以使用 ctx.getBean("&connection"),获得的就是 ConnectionFactoryBean 对象

2、isSingleton 方法返回 true 只会创建一个复杂对象,返回 false 每一次都会创建新的对象

究竟是返回 true(能被共用) 还是 flase(不能被共用) 要根据对象的特点来决定

3、mysql 高版本在进行连接创建的时候,需要指定 SSL 证书,解决的方式:

url = "jdbc:mysql://localhost:3306/java?useSSL=false"

 4、对于依赖注入的体会

把 ConnectionFactoryBean 中依赖的四个 String 信息进行了配置文件的注入

优点:解耦合 

    <bean id="connection" class="factorybean.ConnectionFactoryBean">
        <property name="driverClassName" value="com.mysql.jdbc.mysql"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/java?useSSL=false"></property>
        <property name="username" value="root"></property>
        <property name="paassword" value="123456"></property>
    </bean>

FactoryBean 的实现原理[简易版]

我们来思考两个问题:

1、为什么 Spring 要规定 FactoryBean 接口让我们去实现,并且让我们把创建复杂对象的代码写在 getObject 方法中?

2、为什么通过 ctx.getBean("connection"); 获得的是复杂对象 Connection 而没有获得 ConnectionFactoryBean

其实这里蕴含着的最核心的原理就是我们之前学过的 接口回调

FactoryBean 本质上就是一个接口回调

第一步:根据 connection 获得 <bean 标签相关信息,然后通过 instanceof (FactortyBean) 来判断此时所创建的类是不是 FactortyBean 接口的实现,如果不是 FactortyBean 的实现,就是简单对象,直接 new 运算创建;如果是 FactortyBean 接口的实现,那么就要实现 FactortyBean 接口当中所规定的那三个方法

第二步:getObject 里写了复杂对象的创建代码

第三步:Spring 调用 getObject 的方法

为什么 Spring 要规定 FactoryBean 接口让我们去实现,并且让我们把创建复杂对象的代码写在 getObject 方法中?

1、提供一种更加灵活和可扩展的方式来创建 Bean,通过实现 FactoryBean 接口,我们可以在 getObject 方法中自定义创建对象的逻辑,而不受 Spring 默认的 Bean 创建规则的限制,这样一来,我们可以根据实际需求,自由地进行一些额外的操作,例如创建代理对象、动态生成实例等。
2、FactoryBean 接口还可以用于创建一些特殊类型的 Bean,例如代理对象、代理工厂等。通过在 getObjectType 方法中返回不同的类型,我们可以使用不同的实现类来创建不同的Bean 实例,从而实现更加灵活的 Bean 创建方式。
3、通过将复杂对象的创建代码放在 getObject 方法中,Spring 可以更好地管理 Bean 的生命周期和依赖关系。Spring 会在需要使用该 Bean 时,调用 FactoryBean 的 getObject 方法来获取实例化的对象,并且会对该对象进行依赖注入和生命周期管理,进一步增强了 Spring 框架的灵活性和可扩展性。


Factory Bean 总结

FactortyBean 是 Spring 当中用于创建复杂对象的一种方式,而且这种方式也是 Spring 原生提供的,后续我们学习 Spring 整合其它框架的时候,会大量应用到 FactortyBean 


(2)实例工厂

应用实例工厂的主要原因:

1、避免 Spring 框架的侵入(使用 Spring 框架进行开发的时候,如果使用 FactortyBean ,必须要实现 Spring 所规定的 Factory 接口,这个时候,如果我们离开 Spring ,就意味着我们前面写的 FactortyBean 没有意义了)

2、整合遗留系统

我们要调用 getConnection 方法的时候,得去 new 一个 ConnectionFactory 对象,进而再去调用 getConnection 方法,所以我们把这样的 ConnectionFactory 叫做 实例工厂

public class ConnectionFactory {
    public Connection getConnection() throws ClassNotFoundException, SQLException {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/java?useSSL=false","root","123456");

            return connection;
    }
}

这个就类似于我们所说的遗留代码,此时我们只需要 Spring 去集成它就可以了

所以,作为我们所说的实例工厂,在它的开发过程当中,类和工厂我们都已经有用了,我们只需要去解决我们配置层面上的问题就行了

所以它的开发步骤中,我们主要看它的配置文件怎么处理:

<bean id="connectionFactory" class="factorybean.ConnectionFactory"></bean>、

<bean id="connection" factory-bean="connectionFactory" factory-method="getConnection“></bean>


(3)静态工厂

实例工厂创建连接对象的方法是实例方法,而静态工厂创建对象的方法是静态方法

public class StaticConnectionFactory {
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/java?useSSL=false");
        
        return connection;
    }
}

调用方法的时候,直接 StaticConnectionFactory.getConnection() 即可

静态工厂和实例工厂在配置文件上也有所区别:

<bean id="connection" class="factorybean.StaticConnectionFactory" factory-method="getConnection"></bean>

静态工厂由于不需要对象,直接通过方法就可以进行调用,所以直接写 factory-method 即可


3、Spring 工厂创建对象的总结


 二、控制 Spring 工厂创建对象的次数

在前面学习复杂对象的时候,我们说可以实现 factoryBean 接口,而 factoryBean 接口里面有一个叫做 isSingleton 的方法,这个方法如果 返回 true 意味着只会创建一个复杂对象,如果返回 false 就会返回多个复杂对象

但是它仅仅解决的是复杂对象的创建问题,那么如果我们此时通过 Spring 工厂创建的是简单对象,该如何控制创建对象的次数呢?

1、如何控制简单对象的创建次数

 <bean id="account" scope="singleton | prototype" class="scope.Account"></bean>

singleton : 只会创建一次简单对象

prototype : 每一次都会创建新的对象

如果不写 scope 属性,scope属性的默认值就是 singleton


2、如何控制复杂对象的创建次数

这个知识点前面以及提过了,这里就不再赘述了 

FactoryBean{
 isSingleton(){
     return true 只会创建⼀次
     return false 每⼀次都会创建新的
 }
}

如果没有 isSingleton 方法,还是通过 scope 属性来进行对象创建次数的控制


3、为什么要控制对象的创建次数

有一些对象,是可以被大家共用的,能够被共用的对象,只创建一次就够了

但是有的对象不能被共用,就需要按照实际情况创建对象

所以只有把对象的创建次数进行管理起来之后,我们才能根据对象自身的特点来判断对象的创建次数

优点:节省不必要的内存浪费

什么样的对象可以被共用(只创建一次就行了)?

1. SqlSessionFactory
2. DAO
3. Service

什么样的对象每一次都要创建新的?

1. Connection
2. SqlSession | Session
3. Struts2 Action

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IGEV深度估计测试代码

生成点云的测试脚本&#xff1a; import sys sys.path.append(core) DEVICE cuda import osos.environ[CUDA_VISIBLE_DEVICES] 0 import argparse import glob import numpy as np import torch from tqdm import tqdm from pathlib import Path from igev_stereo import IG…

2020-2023小样本学习(FSL)顶会论文及开源代码合集(已分类整理)

这次分享的是近四年&#xff08;2020-2023&#xff09;各大顶会中的小样本学习&#xff08;FSL&#xff09;论文&#xff0c;有160篇&#xff0c;涵盖了FSL三大类方法&#xff1a;数据、模型、算法&#xff0c;以及FSL的应用、技术、理论等领域。 由于论文数量太多&#xff0c…

【文末赠书】SRE求职必会 —— 可观测性平台可观测性工程(Observability Engineering)

文章目录 〇、导读一、实现可观测性平台的技术要点是什么&#xff1f;二、兼容全域信号量三、所谓全域信号量有哪些&#xff1f;四、统一采集和上传工具五、统一的存储后台六、自由探索和综合使用数据七、总结★推荐阅读《可观测性工程》直播预告直播主题直播时间预约直播 视频…

福建厦门航空飞机发动机零部件检测3D测量尺寸偏差比对-CASAIM中科广电

航空航天是一个创新型发展国家的尖端命脉&#xff0c;代表着一个国家科学技术的先进水平。在航空航天工业的发展和组成领域中&#xff0c;对于在制造业中的航空航天产品零部件精度要求十分严苛&#xff0c;从前期的设计、中期建造、后期维修检测&#xff0c;任何一个环节、任何…

vue一直自动换行问题解决

html换行主要是由于< div >标签引起的&#xff0c;而vue的一些前端组件本身就会自带< div >&#xff0c;比如el-input的标签拆分出来之后就形成了如下的内容 因此之前我采用 <el-form-item prop"code" v-if"captchaOnOff"><el-inpu…

【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数

1004. 最大连续1的个数 III 1004. 最大连续1的个数 III 题目描述&#xff1a; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 解题思路&#xff1a; 首先题目要我们求出的最多翻转k个0后&#x…

BMS电池管理系统的蓝牙芯片 国产高性能 低功耗蓝牙Soc芯片PHY6222

电池管理系统是对电池进行监控与控制的系统&#xff0c;将采集的电池信息实时反馈给用户&#xff0c;同时根据采集的信息调节参数&#xff0c;充分发挥电池的性能。但是&#xff0c;前技术中&#xff0c;在管理多个电池时&#xff0c;需要人员现场调试与设置&#xff0c;导致其…

优化Java代码效率和算法设计,提升性能

在Java开发中&#xff0c;代码效率低下和算法不合理可能导致程序性能下降。下面将从以下几个方面探讨如何优化Java代码和算法设计&#xff0c;以提高程序的性能&#xff1a; 通过这些优化策略&#xff0c;我们可以显著提升Java程序的性能和响应速度。 一、选择合适的数据结构…

这个库,让Python与Excel完美结合

迷途小书童 读完需要 5分钟 速读仅需 2 分钟 1 简介 在现代数据分析和处理中&#xff0c;Python 和 Excel 都扮演着非常重要的角色。如果&#xff0c;能将这两者无缝结合在一起并发挥它们各自的优势&#xff0c;是一个令人兴奋的想法。幸运的是&#xff0c;PyXLL 这个 Excel 插…

Biome-BGC生态系统模型与Python融合技术

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天…

如何实现在本地 Linux 主机上实现对企业级夜莺监控分析工具的远程连接

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 夜莺监控是一款开源云原生观测分析工具&#xff0c;采用 All-in-One 的设计理念&#xff0c;集…

构建无缝的服务网格体验:分享在生产环境中构建和管理服务网格的最佳实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Java的序列化

写在前面 本文看下序列化和反序列化相关的内容。 源码 。 1&#xff1a;为什么&#xff0c;什么是序列化和反序列化 Java对象是在jvm的堆中的&#xff0c;而堆其实就是一块内存&#xff0c;如果jvm重启数据将会丢失&#xff0c;当我们希望jvm重启也不要丢失某些对象&#xff…

Linux学习-Redis主从和哨兵

主从复制 一主一从结构 # 配置host61为主服务器 [roothost61 ~]# yum -y install redis [roothost61 ~]# vim /etc/redis.conf bind 192.168.88.61 #设置服务使用的Ip地址 port 6379 #设置服务使用的端口号 使用默认端口即可 [roothost61 ~]# systemctl start redis [rooth…

深入探索图像处理:从基础到高级应用

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 图像处理是计算机视觉领…

高数(上) 第一章:函数、极限、连续

文章目录 一、函数1.函数的概念、基本初等函数2.函数的性质 /函数四性态1.单调性2.奇偶性(3)导函数的奇偶性 3.周期性4.有界性5.对称性 3.基本不等式4.开根要带绝对值 二、极限1.极限的概念①数列极限②函数极限需要区分左右极限的三种问题 &#xff08;左右极限有区别&#xf…

[网鼎杯 2020 朱雀组]Nmap 通过nmap写入木马 argcmd过滤实现逃逸

这道题也很好玩 啊 原本以为是ssrf 或者会不会是rce 结果是通过nmap写入木马 我们来玩一下 传入木马 映入眼帘是nmap 我们首先就要了解nmap的指令 Nmap 相关参数-iL 读取文件内容&#xff0c;以文件内容作为搜索目标 -o 输出到文件-oN 标准保存-oX XML保存-oG Grep保存-oA…

Python所有方向的学习路线,你们要的知识体系在这,千万别做了无用功!

一直以来都有很多想学习Python的朋友们问我&#xff0c;学Python怎么学&#xff1f;爬虫和数据分析怎么学&#xff1f;web开发的学习路线能教教我吗&#xff1f; 我先告诉大家一个点&#xff0c;不管你是报了什么培训班&#xff0c;还是自己在通过各种渠道自学&#xff0c;你一…

测试团队的建设和管理

一.测试团队的建设 软件的质量不是靠测试出来的&#xff0c;而是靠产品开发团队&#xff08;需求分析工程师&#xff0c;系统设计工程师&#xff0c;程序员&#xff0c;测试工程师&#xff0c;技术支持工程师等&#xff09;所有成员的共同努力来获得的。 软件测试团队不仅仅是指…

计算机毕业设计 基于SSM+Vue的校园短期闲置资源置换平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…