基于FactoryBean、实例工厂、静态工厂创建Spring中的复杂对象

😉😉 学习交流群:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料

🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取!

🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞

一:Spring创建复杂对象

1:复杂对象概念

        什么是复杂对象?什么是简单对象?
        1:简单对象,直接通过new 构造方法创建的对象
        2:复杂对象,不能通过直接new构造方法的创建的对象

        补充说明:
        1:这些复杂对象大多都是Spring集成的一些其他优秀的框架中的核心类的对象,不能直接new,我们也希望Spring能够创建这些类的对象,保证Spring工厂什么对象都可以创建

         2:Spring容器就是Spring工厂

2:常见的复杂对象

        链接对象和SqlSessionFactory对象。

二:基于FactoryBean创建复杂对象

1:概述

         这种方式的本质在一个实现了BeanFactory这样的接口的Bean中,书写创建该复杂对象的代码,这样通过Bean对应id获取到的Bean是复杂对象的Bean而不是这个Bean的对象,Spring非常重要的一种机制,Spring原生提供的帮我们创建复杂对象的方式。

2:开发步骤

        1:实现FactoryBean接口,在该类的getBean()方法代码中创建该类对象
        2:在Spring的核心配置文件中配置这个类
        3:通过这个工厂对象中的getBean方法获取该复杂对象

3:FactoryBean的Method

        getObject()获取该复杂对象,调用这个方法获取到复杂对象,然后在调用Spring工厂对象进行getBean的时候将这个复杂对象进行返回

        获取该复杂对象的Class对象,此对象也是Spring工厂进行调用

        isSingleTon()这个方法返回的事true或者false如果是true的话,表示的是单例设计模式,每次getBean的时候,获取的都是这一个对象,不会多次创建,如果是false的话,每次创建都会创建一个新的复杂对象,返回的也是新的复杂对象

        补充说明:
        他这个复杂对象的创建每个跟每个都不一样,所以,Spring是给定了接口,将对象创建的核心代码让你来写

4:Spring配置文件中的配置

        配置文件当中这样写理论上Spring为我们创建的ConnectionFactoryBean的对象,但是我们使用getBean方法进行获取时候,获取的不再是这个类的对象,而是我们希望获取的所创建的复杂的对象

 

5:FactoryBean开发细节

        如果这个类型是FactoryBean类型的实现,我们获取的是复杂对象,如果我们就想获取这个FactoryBean类型的对象怎么办?getBean的时候,在id前面加上一个&符号,类似于getBean("&conn")这样的话就获取的是FactoryBean类型的对象,isSingleTon()方法返回true的时候,只会创建一个对象,返回false的时候,每次获取spring都会创建一个对象。

        Connection对象能够共用?

        不能公用,链接对象一个很大的作用在于控制事务,假设一个链接开启了事务,假设两个用户都获取到了conn这个对象,你使用这个对象提交了事务,就影响到了我,那就不行。SqlSessionFactory这个对象是线程安全的,重量级的,之创建一次,应该创建一次,应该设置成true。

        获取Connnection对象的时候的一些细节?

        我们对于依赖注入的体会

        通过依赖注入的思想,将写死的内容变成成员变量,然后交由Spring进行依赖注入。获得解耦合的好处。把Connection依赖的四个字符串信息,进行了依赖注入,好处就是解耦合。

        为什么Spring要规定一个factoryBean接口要我们实现,并且将创建复杂对象的代码写在getObject()方法当中(FactoryBean实现原理)?

        接口回调:在java体系当中,接口+反射什么都能做,本质上是一个接口回调,在Spring的底层代码中,通过id值获取ConnectionFactoryBean类的对象,进而判断是不是 BeanFactory接口的实现类(InstanceOf),如果是的话,Spring按照接口约定,调用getObject方法获取Connection对象,返回Connection对象


        为什么说Spring创建的复杂对象都是懒加载的?
        Spring对于复杂对象的创建是懒加载的,使用FactoryBean创建复杂对象,在spring容器进行创建的时候只会先创建实现了FactoryBean这个类的对象,当getBean的时候才会有Spring的接口回调,获取复杂对象并进行返回,所以这是懒加载的

6:Factorybean总结

         Spring当中创建复杂对象的一种方式,也是spring原生提供的,后续我们讲整合其他框架时会大量应用BeanFactory这个接口的形式

三:实例工厂

1:为什么使用实例工厂

        避免Spring框架的侵入,使用Spring框架进行复杂框架开发的时候,如果使用beanFactory进行开发的,必须使用Spring提供的BeanFactory接口,这样日后离开Spring的话,那么久没有什么意义了

        应用实例工厂创建对象,主要是为了整合遗留系统,遗留系统中一些复杂对象的创建已经写好了,而且提供的是class文件不是java文件,这种情况处理的话,就是使用BeanFactory已经没办法了

2:实例工厂编码

class ConnectionFactory{public Connection getConnection(){Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "root");return connection;}
}
    <bean id="connFactory" class="com.pactera.spring.factorybean.ConnectionFactroy"></bean><bean id = "conn" factory-bean="connFactory" factory-method="getConnection"/>


四:静态工厂

        实例工厂需要先创建实例工厂的对象,静态工厂当中直接类名.方法名进行调用就可以了,二者都是为了避免Spring的侵入,为了整合遗留的资源,以上就是Spring创建复杂对象的三种方式

1:配置文件上有些区别

    <!--静态工厂不需要创建对象,直接类名调用就完事了,用的比较少。使用的时候通过getBean("conn")获取的就是这个复杂对象。--><bean id = "conn" class="com.pactera.spring.factorybean.StaticConnectionFactory" factory-method="getConnection"/>

2:Spring工厂创建对象的总结

😉😉 学习交流群:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料

🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取!

🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞

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

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

相关文章

公司网站遇到HTTPS攻击,有什么办法解决

随着互联网的不断发展和进步&#xff0c;Web应用程序的重要性不断提升。Web应用程序往往需要承载大量的用户数据&#xff0c;在传输过程中&#xff0c;为了保护数据安全&#xff0c;往往使用HTTPS协议进行数据加密。但是&#xff0c;HTTPS协议也面临着各种攻击的威胁&#xff0…

会声会影2024旗舰版系统配置要求及格式支持

会声会影2024旗舰版是一款广受欢迎的视频编辑软件&#xff0c;它的最新版本&#xff0c;会声会影2023&#xff0c;已经发布。在这篇文章中&#xff0c;我们将探讨会声会影2024旗舰版系统配置要求及格式支持 会声会影2024是一款专业的视频剪辑软件&#xff0c;能够帮助用户制作高…

如何在h5和小程序中适配iphoneX及更高版本全面屏底部的安全区

关键词 IOS 前言 在项目开发的过程中&#xff0c;需要IOS全面屏底部安全区适配 步骤 h5需要设置页面属性&#xff1a; <meta name"viewport"content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno,viewport-fitcover">2.…

geemap学习笔记016:获取图像的基本属性和描述性信息

前言 遥感数据中通常包含众多信息&#xff0c;例如图像获取的时间、云覆盖量、以及每个波段的最大值最小值等等。 1 导入库并显示地图 import ee import geemapMap geemap.Map() Map2 添加图像数据 centroid ee.Geometry.Point([-122.4439, 37.7538]) #创建一个点坐标lan…

Spark SQL,DF,RDD cache常用方式

RDD中的cache 调用cache方法 val testRDD sc.parallelize(Seq(elementA, elementB, elementC)).map(x > (x._1, x._2)).setName("testRDD")testRDD.cache() dataframe中的cache 利用catalog以表的形式对数据进行缓存 import org.apache.spark.SparkConf impo…

腾讯面试真题(C语言)

一.题目 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 二.题目剖析 首先题目要求不能用乘除&#xff0c;那么&#xff08;首相末项&#xff09;*项数/2就不能用&#xff0c;其次不…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

浅析函数防抖节流

防抖和节流都是前端开发中常用的优化性能的技术。 一、定义 防抖&#xff1a; 防抖指的是在事件触发后&#xff0c;在规定的时间内若再次触发&#xff0c;则重新计时&#xff0c;直到规定时间内没有再次触发事件&#xff0c;才执行事件处理。这样可以避免在短时间内频繁地触发…

Redis实战命令

实战命令 单值缓存 set key value get key 对象缓存 &#xff08;1&#xff09;set user:1 value(json格式) &#xff08;2&#xff09;mset user:1:name junfeng user:1:age 18 mget user:1:name user:1:age 分布式锁 分布式锁解决了什么问题&#xff1f; 分布式锁解…

2 线、3 线和 4 线 RTD 配置之间有什么区别?

电阻温度检测器 (RTD) 是温度传感器的一种&#xff0c;由于其准确性、可重复性和稳定性而广泛应用于各种工业应用。这些设备通过感测材料温度变化时电阻的变化来测量温度。 RTD 探头有多种配置&#xff0c;包括 2 线、3 线和 4 线型号。这些类型之间存在显着差异&#xff0c;在…

【干货】接口公共方法(字典表查询)

公共方法 import * as api from /api/commonAjax.js;//获取字典表 const getAjaxListCommonfunction(mm,backfun) {let ajaxFun""if(mm1){//字典表1ajaxFun"getAjax1"}else if(mm2){//字典表2ajaxFun"getAjax12"}api[ajaxFun]({}).then((res)&g…

唯创知音WT2003H系列MP3录音语音芯片:多样封装,录音时长可达70S,满足各种应用需求

在日益发展的电子产品市场中&#xff0c;音频芯片作为产品的重要组成部分&#xff0c;对于提升用户体验和产品质量具有不可忽视的作用。唯创知音的WT2003H系列MP3录音芯片便是其中的佼佼者&#xff0c;其录音时长最多可录70S&#xff08;采样率为8K&#xff09;&#xff0c;并且…

世岩清上:档案馆展厅设计的特色化

档案馆展厅设计的特色化不仅可以增强参观者的体验感&#xff0c;还可以更好地展现档案馆的历史文化价值。 在设计档案馆展厅时&#xff0c;我们可以通过以下几个方面来让其更具特色&#xff1a; 一、主题明确 首先&#xff0c;确定展厅的主题是关键。可以是档案馆的历史沿革…

git本地新建分支推送到其它分支

1&#xff0c;源码下完成bsp和项目环境配置 2&#xff0c;提交到gitlab master源码仓库 3&#xff0c;在本地仓库新建并切换分支 git branch rel_xxxgit checkout -b rel_xxx4&#xff0c;打包 5&#xff0c;新分支提交本地 6&#xff0c;git切换仓库到项目仓库 git remote ren…

Css解决浏览器缩放后,边框与图片之间有空白的问题

关键词 Css 前言 在项目开发的过程中&#xff0c;提高浏览器分辨率后&#xff0c;边框与图片之间会显示一点空白 原因 当缩放到175%时&#xff0c;应该1.75格代表1像素&#xff0c;但由于硬件层次限制&#xff0c;比如一格用四个物理像素点绘制&#xff0c;0.25格就不绘制&…

智能优化算法应用:基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.回溯搜索算法4.实验参数设定5.算法结果6.参考…

ubuntu改window任务栏

经常在ubuntu和win之间切换&#xff0c;任务栏的布局不统一会让人很别扭&#xff0c;个人很喜欢win任务栏的不折叠图标功能&#xff0c;而ubuntu没有&#xff0c;又很喜欢的ubuntu的多工作空间&#xff0c;效率比副屏还高&#xff0c;还可以自定义切换工作空间的快捷键。鱼和熊…

2023-11-28-直播单细胞图表美化-seurat数据结构 featureplot dotplot vlnplot

单细胞常见的可视化方式有DimPlot&#xff0c;FeaturePlot &#xff0c;DotPlot &#xff0c;VlnPlot 和 DoHeatmap几种 &#xff0c;Seurat中均可以很简单的实现&#xff0c;但是文献中的图大多会精美很多。 之前 跟SCI学umap图| ggplot2 绘制umap图&#xff0c;坐标位置 &am…

[SaaS] 广告创意中stable-diffusion的应用

深度对谈&#xff1a;广告创意领域中 AIGC 的应用这个领域非常快速发展&#xff0c;所以你应该保持好奇心&#xff0c;不断尝试新事物&#xff0c;不断挑战自己。https://mp.weixin.qq.com/s/ux9iEABNois3y4wwyaDzAQ我对AIGC领域应用调研&#xff0c;除了MaaS服务之外&#xff…

浅谈Elasticsearch安全和权限管理

Elasticsearch 安全和权限管理 Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎&#xff0c;它使得用户可以快速地存储、搜索和分析大量数据。在企业级应用中&#xff0c;保证数据的安全性和权限管理是至关重要的。本文将详细讲解 Elasticsearch 的安全和权限管理功能…