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

news2024/11/15 20:00:59

一、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和getBeanNameForType
		StaticListableBeanFactory (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.coloradmin.cn/o/1380743.html

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

相关文章

redis高级篇之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程? 3、主线程和Io线程是怎么协作完成请求处理的? 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程,4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

智慧农业大棚建设方案——福建蜂窝物联

一、项目背景 温室大棚在不适宜植物生长的季节,能提供生育期和增加产量,多用于低温季节喜温蔬菜、花卉、林木等植物栽培或育苗等。因此对种植作物生长环境的要求要精确的多。 大多数农户加温、浇水、通风等,全凭感觉。人感觉冷了就加温&#…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处,将连接跟踪信息记录在报文上,在出口进行confirm.确认后的连接信息 本文以一个本机上送…

【LeetCode每日一题】2182. 构造限制重复的字符串

2024-1-13 文章目录 [2182. 构造限制重复的字符串](https://leetcode.cn/problems/construct-string-with-repeat-limit/)思路: 2182. 构造限制重复的字符串 思路: 按照字符出现次数从高到低的顺序进行重复,通过维护一个指针 j 来寻找下一个…

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

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

Java判断字符串当中是否有中文符号(不是中文名称,是符号)

public static void main(String[] args) throws ParseException, IOException, URISyntaxException {// 测试示例String testString1 "Hello,test!";String testString2 "This is a test.";boolean result1 containsChineseSymbols(testStr…

又涨了:net的域名铁定涨价

关注卢松松,会经常给你分享一些我的经验和观点。 又要涨价了,又要涨价了,又要涨价了!继.com域名涨价后,.net的域名也逐步涨价。最近一年来域名疯狂涨价,几个月内已经几乎翻番。 阿里云2月1日起上调.net英文域名价格…

专业课148,总分410+电子科技大学858信号与系统考研经验电子信息与通信

今年专业课148分,总分410顺利被电子科技大学录取,回望这一年复习还有很多不足,总结一下自己的复习经历,希望对大家复习有所帮助。 数学:(多动手,多计算,多总结,打好基础…

YOLOv8改进:小目标涨点系列篇 | UNet v2 多层次特征融合模块结合DualConv、GSConv

🚀🚀🚀本文改进:多层次特征融合(SDI)结合DualConv、GSConv模块等实现二次创新 🚀🚀🚀SDI 亲测在多个数据集能够实现涨点,同样适用于小目标检测 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研…

Android 13 辅助屏导航栏不显示问题

问题 在Android 13 上开启辅助屏幕。但是发现辅助屏systemui 导航按 icon没有显示,但是点击对应的区域有作用 分析 可以用 anroid device monitor 工具分析视图 解决 public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);…

微信订阅号 服务号区别

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?很多小伙伴想把服务号改为订阅号,但是不知道改了之后具体有什么作用,今天跟大家具体讲解一下。首先我们知道服务号一个月只能发四次文章,但是订阅号每天都可以发…

GitHub注册新账号的操作流程(详细)

目录 第一步 进入官网,点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…

VMware workstation安装debian-12.1.0虚拟机并配置网络

VMware workstation安装debian-12.1.0虚拟机并配置网络 Debian 是一个完全自由的操作系统!Debian 有一个由普罗大众组成的社区!该文档适用于在VMware workstation平台安装debian-12.1.0虚拟机。 1.安装准备 1.1安装平台 Windows 11 1.2软件信息 软…

软件测试|Selenium StaleElementReferenceException 异常分析与解决

简介 Selenium 是一个流行的自动化测试工具,用于模拟用户与网页交互。然而,当我们在使用 Selenium 时,可能会遇到一个常见的异常,即 StaleElementReferenceException。这个异常通常在我们尝试与网页上的元素交互时抛出&#xff0…

跟着cherno手搓游戏引擎【5】layer(层)

编写基类层: Layer.h:提供Attach链接、Detach解绑、Update刷新、Event事件、GetName方法 #pragma once #include"YOTO/Core.h" #include"YOTO/Event/Event.h" namespace YOTO {class YOTO_API Layer{public:Layer(const std::string& nam…

竞赛保研 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

只不过孤岛罢了:我的2023年总结

2023已悄然过去,还记得跨年夜那天,我突然接到一星期要期末考的消息,我的内心是多么奔溃,先不说一天一门强度如此之高,重要的是矩阵论,工程优化等等科目,还要速成,于是麻木得预习一日…

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战14(BitMap实现用户签到功能) 📚订阅专栏&am…

Open CASCADE学习|基于visual studio 2022编译源码

目录 1、简介 2、下载 2.1下载visual studio 2022 community 2.2下载下载cmake工具 2.3下载源码 2.4下载第三方插件 3、安装 3.1安装visual studio 2022 community 3.2安装cmake 4、编译源码 5、测试 1、简介 Open CASCADE(简称…

maya , motionbuilder 骨骼动画相关操作与脚本

文章目录 Maya导入时增加namespacemaya 解除/增加父子关系maya 修改骨骼局部坐标系显示骨骼局部坐标系删除不需要的骨骼重命名骨骼重定向基础细节 Motionbuildermb同时打开两个动画文件 Maya 导入时增加namespace import pymel.core as pm pm.namespace(add"src") …