基于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:以上内容,进群免费领取呦~ 💞💞💞💞
相关文章:
基于FactoryBean、实例工厂、静态工厂创建Spring中的复杂对象
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
Android 如何让路由器或者其他AP设备获取到主机名
问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…...
java三大集合类--List
List Set Map 一、List 几个小问题: 1、接口可以被继承吗?(可以) 2、接口可以被多个类实现吗?(可以) 3、以下两种写法有什么区别? //List list1new List();是错误的因为List()…...
机器人向前冲
欢迎来到程序小院 机器人向前冲 玩法:一直走动的机器人,点击鼠标左键进行跳跃,跳过不同的匝道,掉下去即为游戏接续, 碰到匝道铁钉游戏结束,一直往前冲吧^^。开始游戏https://www.ormcc.com/play/gameStart…...
jq——实现弹幕滚动(往左滚动+往右滚动)——基础积累
最近同事在写弹幕功能,下面记录以下代码: 1.html代码 <div id"scrollContainer"></div>2.引入jq <script src"./script/jquery-1.8.3.js" type"text/javascript"></script>3.jq代码——往左滚…...
深度学习第2天:RNN循环神经网络
☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…...
深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介主要特点使用步骤 二、功能三、系统四. 总结 一项目简介 # Introduction to PaddleOCR Image Character Detection and Recognition System Based on Baidu…...
九、LuaTable(表)
文章目录 一、定义二、Table(表)的构造三、Table 操作(一)Table连接(二)插入和移除(三)Table 排序(四)Table 最大值 一、定义 table 是 Lua 的一种数据结构用来帮助我们创建不同的数…...
每日一题(LeetCode)----链表--链表最大孪生和
每日一题(LeetCode)----链表–链表最大孪生和 1.题目(2130. 链表最大孪生和) 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 < i < (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n…...
腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群
原创/朱季谦 最近买了一台4核16的腾讯云轻量应用服务器,花了我快四百的大洋,打算搭建一堆docker组件集群,最先开始是通过docker搭建redis集群,计划使用三个端口,分别是7001,7002,7003。 腾讯云服务器有防火墙限制,故…...
C++学习之路(十一)C++ 用Qt5实现一个工具箱(增加一个进制转换器功能)- 示例代码拆分讲解
上篇文章,我们用 Qt5 实现了在小工具箱中添加了《时间戳转换功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 进制转换 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们的工具…...
C语言每日一题(40)栈实现队列
力扣232 用栈实现队列 题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并…...
Vue.js 的生命周期
Vue.js 的生命周期钩子函数是一组在 Vue 实例生命周期中执行的函数,它们允许你在特定阶段执行自定义逻辑。以下是 Vue.js 的生命周期钩子函数以及它们在生命周期中的执行时机: 1、beforeCreate: 在实例初始化之后,数据观测 (data observer)…...
SeaTunnel引擎下的SQL Server CDC解决方案:构建高效数据管道
在快速发展的数据驱动时代,实时数据处理已经成为企业决策和运营的关键因素。特别是在处理来自各种数据源的信息时,如何确保数据的及时、准确和高效同步变得尤为重要。本文着重介绍了如何利用 SqlServer CDC 源连接器在 SeaTunnel 框架下实现 SQL Server …...
【攻防世界-misc】Encode
1.下载解压文件,打开这个内容有些疑似ROT13加密,利用在线工具解密:ROT13解码计算器 - 计算专家 得到了解密后的值 得到解码结果后,看到是由数字和字母组成,再根据题目描述为套娃,猜测为base编码(…...
visual c++ 2019 redistributable package
直接安装下面包只有24M Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://aka.ms/vs/16/release/VC_redist.x64.exe ———————————————— 版权声明:本文为CSDN博主「kpacnB_Z」的原创文章…...
WPF中DataGrid解析
效果如图: 代码如下: <DataGrid Grid.Row"1" x:Name"dataGrid" ItemsSource"{Binding DataList}" AutoGenerateColumns"False"SelectedItem"{Binding SelectedItem,UpdateSourceTriggerPropertyChange…...
在数据库中进行表内容的修改(MYSQL)
根据表中内容,用命令语句创建数据库,表格,以及插入,修改,删除表格中的内容。 创建数据库:zrzy mysql> create database zrzy; 引用zrzy数据库: mysql> use zrzy; 创建student_info表&…...
Android中的多进程
在Android中也可以像pc一样开启多进程,这在android的编程中通常是比较少见的,以为在一个app基本上都是单进程工作就已经足够了,有一些特殊的场景,我们需要用多进程来做一些额外的工作,比如下载工作等。 在Android的An…...
Apache2.4 AliasMatch导致301重定向问题?
环境:ubuntu18.04-desktop apache2版本: rootubuntu:/etc/apache2# apache2ctl -v Server version: Apache/2.4.29 (Ubuntu) Server built: 2023-03-08T17:34:33apache配置: DocumentRoot /var/www/html # Alias就没事 # Alias "/my…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
