橘子学Spring01之spring的那些工厂和门面使用

一、Spring的工厂体系

我们先来说一下spring的工厂体系(也称之为容器),得益于大佬们对于单一职责模式的坚决贯彻,在十几年以来spring的发展路上,扩展出来大量的工厂类,每一个工厂类都承担着自己的功能(其实就是有对应的方法实现)。对此我想说,我谢谢你们,我谢谢你们全家。

我们以前玩spring入门的时候大家都见过ApplicationContext这个工厂类,这个类类似于一个门面,类似我们以前玩Mybatis的时候的的SqlSession这个东西。就是一个门面,给程序员使用的。他的功能实际上非常多,因为继承了N多底层类,拥有很多其他类的功能,他的底层下面其实还有为他办事的其他类,直接研究他容易乱,那么我们就来看看下面的这个比较最基层的工厂BeanFactory。

1、BeanFactory及其扩展工厂

我们一路跟到了BeanFactory这个类里面,看一下他的注释。
在这里插入图片描述
我们看到注释表达的意思就是这个类就是容器类的根类,也就是最底层的那个类。那我们就基于这个类看一下他的类结构图,你鼠标放在这个类名上面,键盘敲Ctrl+H,IDEA就能显示出BeanFactory的类结构图。我们可以看到这个东西。

在这里插入图片描述
你也可以在右边全选(Ctrl +A),然后右键显示Diagram。而且这个Diagram还可以右键继续导出成图片格式。成为这样。
在这里插入图片描述
然后我们就来看看这个类结构的展开格式。解释一下其中几个类的作用。也就是这几个类。
在这里插入图片描述
下面先简单一一解释一下几个工厂类的作用也就是其功能。

BeanFactory (org.springframework.beans.factory):Spring体系的最顶层工厂,这里面定义了一些关于工厂的基本操作。就是基于类工厂的一些功能,你既然是类工厂,那你肯定能创建类,创建完了还能获取到你创建的类。这些基本功能都在这里被规范好了基础定义。基于他是个方法,那么其实他定义的功能后面肯定有接口为其实现。他规定的是最早的一些工厂能力。HierarchicalBeanFactory (org.springframework.beans.factory):这个接口的能力是父子容器的管理(springmvc里面有这个概念),这个类里面的方法,实现了关于父子容器管理的能力。ConfigurableBeanFactory (org.springframework.beans.factory.config):这个工厂提供了一些配置能力,比如单实例,多实例的配置,类型的转换,后置处理bean的方法能力。都在这个接口里面被定义,他实现了这些方法拥有了这些功能。ApplicationContext (org.springframework.context):这个是集工厂类能力大成的一个工厂类,他基本拥有了所有能力,所以我们编程的时候,一般使用的也就是这个类。你也能看到他其实处于一个相对高层的继承了,他拥有了很多功能。SimpleJndiBeanFactory (org.springframework.jndi.support)AutowireCapableBeanFactory (org.springframework.beans.factory.config):提供了自动注入的能力(Autowaire),我们说自动注入其实就是这个工厂实现的他的功能,并且在生命周期中的intinitalBean(初始化bean的时候调)和DisposeBean(销毁的时候调)这两个个bean也是在这里提供的能力,你的bean实现这两个接口就可以在初始化和销毁的时候回调对应的函数,做一些自己的定制化。而销毁和初始化的能力就是这个工厂提供的。ConfigurableListableBeanFactory (org.springframework.beans.factory.config)AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)ListableBeanFactory (org.springframework.beans.factory):获取相关的配置信息,constrainsBeanDefinition和getBeanNameForTypeStaticListableBeanFactory (org.springframework.beans.factory.support)ApplicationContext (org.springframework.context)ConfigurableListableBeanFactory (org.springframework.beans.factory.config)DefaultListableBeanFactory (org.springframework.beans.factory.support):这个也是一个大成类,基本拥有所有的主要能力。XmlBeanFactory (org.springframework.beans.factory.xml):可以读取xml配置文件,创建相应的对象。

DefaultListableBeanFactory这个提供了基本所有主要能力的工厂,给了我们很多作用,然后现在基本的spring都是基于xml配置的,所以他又提供了关于读取xml的能力,也就是他还有的一个子类XmlBeanFactory,这个类看名字也知道什么路子,所以XmlBeanFactory其实更牛逼,他还能基于xml配置的时候进行处理,XMLBeanFactory能处理xml的原因是他内部有一个属性工具类XmlBeanDefinitionReader。

ApplicationContext也是一个集大成的类,他拥有很多功能,所以我们编程一般会使用这个。

spring的学习会有一个词经常被提及,就是那个工厂类有哪些能力,我们说在编程世界中,能力指的就是他提供了这个方法去做这件事。而怎么做这件事,就是定义的方法,可能有的方法为了内聚会封装在一些类中,作为属性初始化的时候获取,后面使用这个能力。

1.1、关于xml的读取简述

我们开始使用spring的时候,很多都是直接通过解析xml来配置bean。我们先以这种最开始的模式来看一下操作。
其实我们进入spring的一个入口就是读取这个xml文件。我们一般的写法是:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ctx.getBean("u");

我们在这个程序中,只需要指明了配置文件的路径(代码中是classpath)就可以了。可见真的很顶层,实现全部封装了。但是我们这里是开始学习spring的底层的,所以我们就玩点底层的类。也就是BeanFactory类。

// 1. 读取XML配置文件,XML配置文件 封装 Java对象 ---> 创建工厂生产的对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 2. 从工厂容器中获得对象
User user = (User) beanFactory.getBean("u");

我们使用了更底层的BeanFactory来承接,我们看到这个就需要做更多工作了,传进去了ClassPathResource这个参数进去了,而ApplicationContext则封装了这一步。你看到他的意思其实就是从类路径加载类资源。我们跟进去ClassPathResource这个类看看。继续点击CTRL+H我们看看这个类的继承关系。因为是接口,所以选红框那个。
在这里插入图片描述
我们看到最后这个类实现自InputStreamSource这个接口,这个接口里面提供了一个方法:

InputStream getInputStream() throws IOException;
获取输入流,这里其实我们就可以知道了,他是在这里把xml文件拿到最后得到文件的一个文件流,这里其实很像Mybatis,都是获取配置文件的文件流。其实也就是这样的。

而Resource接口实现了InputStreamSource,InputStreamSource这个接口的getInputStream()方法提供了花式读取文件获取输入流的各种实现,差不多有几十种,我简单列几种。

Resource接口  目的 读取相关资源文件的内容 获得输入流文件 ---xml  .properties  .txt 网络中的资源FileSystemResource
ClassPathResource
ByteArrayResource
ServletContextResource 
...

至此我们知道了主体是啥样的。再进一步说我们以前玩Mybatis的时候知道,文件读取这种操作设计IO,是重资源,肯定是要一次读取到JVM解析完了然后封装在java对象里面,后面用的时候再拿(万物皆对象)。
那么:
spring配置文件的内容以什么形式体现。
mybatis-config.xml解析之后封装到了Configuration对象中。
mapper文件解析之后封装到了MappedStatement对象中。

其实在Spring中解析了配置文件之后把流文件解析封装到了BeanDefinition这个类中,只不过Mybatis用的是Xpath解析的,Spring用的是SAX解析的(年代久的都是这个), 至此,我们知道了她的来龙去脉,所以我们到这里就触及到了BeanDefinition。下面我们就来研究这个过程。

1.2、总结一下

我们使用xml来读取工厂,代码如下:

// 1. 读取XML配置文件,XML配置文件 封装 Java对象 ---> 创建工厂生产的对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 2. 从工厂容器中获得对象
User user = (User) beanFactory.getBean("u");
# 总结起来就是:
# 1、XmlBeanFactory工厂拥有通过解析xml来封装bean的能力。这个能力来自于他的一个属性,XmlBeanDefinitionReader,他解析xml需要传入的参数是 ClassPathResource。
# 2、ClassPathResource最终实现了Resource接口,Resource接口定义了getInputStream读取输入流的方法,Resource接口有N种实现类,其中包括ClassPathResource,实现了不同种类的getInputStream,包括获取文件输入流,网络文件输入流等等。而ClassPathResource实现的就是通过指定文件路径来获取文件输入流。
# 3、最后就等于XmlBeanFactory拥有XmlBeanDefinitionReader,XmlBeanDefinitionReader传入了ClassPathResource,ClassPathResource通过getInputStream()方法获取到了xml的文件输入流,此时XmlBeanDefinitionReader就获取到了文件输入流,此时在程序中就能解析这个文件了,表现在代码使用的那两句就是XmlBeanFactory解析了xml文件。

OK,至此我们就知道了关于我们使用代码获取工厂和bean的一个门面操作,后续的操作我们会逐步展开,分析其中的流程和逻辑。

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

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

相关文章

Linux 期末复习

Linux 期末复习 计算机历史 硬件基础 1,计算机硬件的五大部件:控制器、运算器、存储器、输入输出设备 2,cpu分为精简指令集(RISC)和复杂指令集(CISC) 3,硬件只认识0和1,最小单位是bit,最小存储单位是字…

【论文阅读】Non-blocking Lazy Schema Changes in Multi-Version

Non-blocking Lazy Schema Changes in Multi-Version Database Management Systems 1. Intro 1.1 Motivation 一个是online能够提供不停机的更新的能力,在很多业务系统里面是必要的。第二个是满足高可用,SaaS、PaaS要提供高可用的系统给用户&#xff…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

openssl3.2 - 官方demo学习 - cms - cms_ver.c

文章目录 openssl3.2 - 官方demo学习 - cms - cms_ver.c概述运行结果笔记END openssl3.2 - 官方demo学习 - cms - cms_ver.c 概述 CMS验签, 将单独签名和联合签名出来的签名文件都试试. 验签成功后, 将签名数据明文写入了文件供查看. 也就是说, 只有验签成功后, 才能看到签名…

如何在你的网站接入QQ登录?

文章目录 准备阶段申请QQ登录的权限创建应用最后上传qqlogin.php代码 准备阶段 国内服务器和备案域名需要你有张独一无二本人的身份证你正面手持身份证的图片一张100px*100px的网站图标 申请QQ登录的权限 首先访问qq互联,点击我直接访问 登陆完成后我们点击面的…

常用计算电磁学算法特性与电磁软件分析

常用计算电磁学算法特性与电磁软件分析 参考网站: 计算电磁学三大数值算法FDTD、FEM、MOM ADS、HFSS、CST 优缺点和应用范围详细教程 ## 基于时域有限差分法的FDTD的计算电磁学算法(含Matlab代码)-框架介绍 参考书籍:The finite…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…

软件测试|教你使用Python绘制正多边形

简介 绘制正多边形是Python图形编程的基本任务之一。在本文中,我将为你提供一个使用Python绘制正多边形的详细教程,并提供一个示例代码。我们将使用Python的Turtle库来进行绘制。 步骤1:导入Turtle库 我们需要先安装好Python环境&#xff…

【信息安全】深度分析邮件安全及钓鱼攻击防范

本博文共计3100余字,预计需阅读20分钟 【邮件安全建设】 一、前言 邮件系统作为企业办公网络架构中重要的组成部分,同时也是业务高频使用的办公应用,一旦出现安全问题,业务将会被严重干扰甚至中断,本篇博客通过攻守两…

软件测试|Python数据可视化神器——pyecharts教程(十)

使用pyecharts绘制漏斗图 简介 漏斗图(Funnel Chart)是一种用于可视化数据流程或转化率的图表类型。它通常由一系列阶段组成,每个阶段都有一个名称和一个值,表示在该阶段的转化量或数据流程的进展情况。漏斗图的名称来源于其外观…

浅析五种 React 组件设计模式

作为一名 React 开发者,你可能会面临下面几个问题: 如何构建一个高复用度性的组件,使其适应不同的业务场景?如何构建一个具有简单 API的组件,使其易于使用?如何构建一个在 UI 和功能方面具有可扩展性的组件…

[C#]使用winform部署PP-MattingV2人像分割onnx模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleSeg 【算法介绍】 PP-MattingV2是一种先进的图像和视频抠图算法,由百度公司基于PaddlePaddle深度学习框架开发。它旨在提供更精准和高效的图像分割功能,特别是在处理图像中的细微部分&#xf…

set -e的作用

今天看人家代码看到一个很有意思的命令 后面我搜索了一下,感觉还是很好用的 set -e 是一个调试用的好东西 比如test.sh echo "执行第一个命令" cd /aaa/bbb echo "执行第二个命令"结果如下 可以看到第二个命令是执行了,虽然我的第…

利用C语言实现输出杨辉三角的前10行

杨辉三角的特点 第一列都为1&#xff0c;对角线为1 第x行第x列为1 第几行就有几个元素 从第三行开始,第二列的元素等于第二行的第一列元素第二列元素之和(排除从第三行开始的首和尾元素) //用C语言实现打印出10行杨辉三角 #include<stdio.h>int main(){int a[10][10];//…

使用RNN完成IMDB电影评论情感分析

使用RNN完成IMDB电影评论情感分析 任务描述一、环境设置二、数据准备2.1 参数设置2.2 用padding的方式对齐数据2.3 用Dataset与DataLoader加载三、模型配置四、模型训练五、模型评估六、模型预测 任务描述 本示例教程演示如何在IMDB数据集上使用RNN网络完成文本分类的任务。IM…

二极管限幅电路理论分析,工作原理+作用

一、限幅是什么意思&#xff1f; 限幅也就是&#xff0c;将电压限制在某个范围内&#xff0c;去除交流信号的一部分但不会对波形的剩余部分造成影响。通常来说&#xff0c;限幅电路主要是由二极管构成&#xff0c;波形的形状取决于电路的配置和设计。二、限幅电路工作原…

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀

目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合&#xff0c;集成了一批最常用 Unix 工具命令&#xff0c;只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用&#xff0c;能在多款 POSIX 环境的操作系统&#xff08;如 Linu…

Vulnhub靶机:driftingblues 3

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues3&#xff08;10.0.2.19&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

WebGL在实验室方向的应用

WebGL在实验室方向的应用涉及到实验过程的可视化、数据分析、模拟等方面。以下是一些WebGL在实验室领域的应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.分子模型和化学反应模拟&#xff…

D25XB80-ASEMI开关电源桥堆D25XB80

编辑&#xff1a;ll D25XB80-ASEMI开关电源桥堆D25XB80 型号&#xff1a;D25XB80 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-5&#xff08;带康铜丝&#xff09; 特性&#xff1a;插件、整流桥 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;25A 最大反向击…