【Spring基础】从0开始学习Spring(2)

前言

在上篇文章,我已经讲了Spring中最核心的知识点:IoC(控制反转)以及DI(依赖注入)。这篇文章,我将讲一下关于Spring框架中的其它比较琐碎但是又还是挺重要的知识点,因此,如果没有阅读过我上篇文章,建议先看一下,这会对阅读接下来的内容有着很好的帮助:【IoC控制反转】看完必定强大!立刻奏效!-CSDN博客

1. 什么样的架构,我们认为是一个优秀的架构?

我认为是可维护性好,可扩展性好的架构。

那什么叫可扩展性好呢?

其实我的理解就是在不断添加新的代码的同时,可以不修改原有代码。

那如何让程序维护性好,可扩展性好呢?

在Java业界是有一个公认的标准的:高内聚,低耦合。

高内聚就是尽量将代码写在与之功能描述一致的模块中。如User表的操作写在UserDAO里面,不要写在非UserDAO的类里面。低耦合就是尽量减少类与类之间的直接关系。

什么是直接关系?

Controller层依赖Service层,在Controller层直接new Service层的类的对象。Service层依赖Dao层,在Service层直接new Dao层的对象。

Spring框架就是通过IoC/DI(控制反转/依赖注入)实现程序的解耦。从而提高程序的维护性和扩展性。

2. Spring是什么?这个框架到底有啥用?

定义:Spring是一个JavaEE轻量级的一站式开发框架。

JavaEE: 就是用于开发企业级(B/S)应用的技术。

轻量级:使用最少代码启动框架,然后根据需求选择需要使用的模块。

一站式:提供了表示层,服务层,持久层的所有支持。

我猜你不懂我在说什么,因为这是定义,比较晦涩,所以我讲一下我自己对于Spring定义的理解吧。

什么是轻量级?

就是除内核模块,其他模块由开发者自由选择使用,同时支持整合其他框架。也可以称为可插拔式开发框架,像插头和插座一样,插上就用,不用就拔下来。这就是Spring框架核心理念。

什么是一站式?

就是Spring框架提供涵盖了JavaEE开发的表示层,服务层,持久层的所有组件功能。也就是说,原则上,学完一套Spring框架,不用其他框架就可以完成网站一条流程的开发。

Spring的所有组件如下图:

总结一下,Spring是一个JavaEE轻量级一站式开发框架。它提供的功能涵盖了JavaEE程序中的表示层,服务层,持久层功能组件。这意味着,单单Spring框架就可以满足整个JavaEE程序的开发。但Spring框架,更加强调的是它的轻量级(模块的可插拔)。也就是说,除了内核模块,其他功能模块如果你想使用可以不用,并且Spring框架能够整合任何第三方的框架。在现实开发中,Spring主要用于整合其他框架

3. 为什么Spring可以实现模块的可插拔?

Spring之所以可以实现模块的可插拔是支持依赖注入,所谓的依赖注入就是不用new就可以创建对象。我来展示一下使用Spring框架,不用new创建一个对象。

我举一个NBA的例子,涉及球队(Team)和球员(Player)两个类,并使用Spring框架来管理它们之间的关系。

1.创建一个普通类,表示球队(Team),然后,我们创建另一个普通的Java类,表示球员(Player):

2. 创建一个Spring配置文件,命名为applicationContext.xml,用于描述类与类之间的关系。

3. 创建ApplicationContext容器对象,根据Spring配置文件的描述,创建对象并放在Spring容器里面。

4. 使用ApplicationContext容器对象的getBean方法,获取Spring容器里面的对象

4. XML管理Bean是啥东西?

XML管理对象(也称为XML管理Bean)是一种将对象的配置信息存储在XML文件中,并使用XML文件来创建和管理对象的方法。在这种模式下,XML文件用于定义对象的属性和配置,包括对象的类名、属性值、依赖关系等。XML文件可以被解析和读取,然后根据其中的配置信息创建相应的对象,并将对象的属性值设置为配置文件中指定的值。这种方式使得对象的创建和配置与代码的实现分离,提供了更大的灵活性和可配置性。

当涉及到XML管理对象(Bean)时,一个常见的例子是使用Spring Framework进行对象的配置和管理。我举一个例子,展示一下如何使用XML配置文件来定义和创建对象:

假设我们有一个名为"Person"的Java类,代表一个人的信息,包括姓名和年龄。我们将使用XML配置文件来管理"Person"对象。

首先,我们创建一个名为"beans.xml"的XML配置文件,内容如下:

在上述XML配置文件中,我们定义了一个名为"person"的Bean,它的类是"com.example.Person"。我们使用<property>元素来设置对象的属性值,这里设置了"name"属性为"John Doe","age"属性为"30"。

接下来,我们可以编写Java代码来读取和使用这个XML配置文件。假设我们有一个名为"MainApp"的类:

在上述代码中,我们使用Spring的ClassPathXmlApplicationContext类来加载XML配置文件,并创建一个应用程序上下文。通过调用getBean()方法,我们可以从上下文中获取配置的对象。在这个例子中,我们获取了名为"person"的Bean,并使用它的方法打印姓名和年龄。

运行这个示例代码,它将读取"beans.xml"配置文件,并创建一个"Person"对象,输出姓名和年龄。

看到这里,相信你已经理解了XML管理Bean是啥东西了。不过很遗憾的是,XML管理对象的方式逐渐被更现代的配置和管理方式所取代,如注解驱动的配置、Java配置类等。这些方式提供了更简单、更灵活和更强大的配置和管理功能,例如Spring Framework中的注解配置和Java Config。所以,这里我们只是了解一下大概是怎么回事儿就好,不需要说刻意去记忆。

5. bean是什么?如何实例化bean?

当谈到Spring中的Bean时,可以将其比喻为餐厅的菜单和菜品。

在一家餐厅中,菜单是表示可供选择的菜品的列表,而每道菜品则是一个具体的实例。类比到Spring中,菜单可以看作是应用程序的配置文件或注解,它列出了可用的Bean定义,而每个具体的菜品则对应于由Spring容器实例化和管理的Bean。

在餐厅里,菜单上的每道菜品都有自己的特点和属性,例如名称、描述、价格等。类似地,在Spring中,每个Bean也有自己的属性和配置信息,例如类名、依赖关系、作用域等。

当顾客在餐厅点菜时,服务员会根据菜单上的信息来准备并提供相应的菜品。类似地,在Spring中,当应用程序启动时,Spring容器会根据配置文件或注解中的信息来实例化和配置Bean,并在需要时将它们提供给其他组件使用。

通过菜单,顾客可以选择自己喜欢的菜品,并根据自己的需求定制。类似地,在Spring中,开发人员可以根据应用程序的需求选择和配置自己需要的Bean,以实现功能的定制和灵活性。

那如何实例化bean呢?就像这样:

反正你其实只要大概知道一下我们经常说的bean是什么?看到类似这种代码知道是在干啥就好了。

6. 能否举一个依赖注入的例子?

依赖注入有两种方法:构造函数注入和利用setter实现。下面我举一个构造函数注入的例子。为什么不举用setter实现的例子呢?因为我这篇文章只是让你简单了解一下依赖注入在代码中到底是怎么搞的,让你在脑海里有个印象,而且你不可能看了我一篇文章就直接可以徒手打出来吧哈哈。

例子如下:

假设我们有一个NBA球队管理系统,其中包含了以下几个关键组件:Team(球队)、Coach(教练)和Player(球员)。

在没有依赖注入的情况下,我们可能会在Team类中直接实例化Coach和Player,并在需要时直接调用它们的方法。就像这样:

在上述代码中,Team类直接依赖于Coach和Player,它在构造函数中创建了这两个对象的实例并使用它们。

然而,这种直接实例化的方式存在一些问题。首先,Team类与具体的Coach和Player类紧密耦合,难以进行单元测试和替换。其次,如果我们想在未来更改教练或球员的实例,需要修改Team类的代码。

通过使用依赖注入,我们就可以不修改Team的代码。我们可以将依赖的对象作为参数传递给Team类的构造函数或者通过setter方法注入。就像这样:

现在,Team类不再负责创建Coach和Player的实例,而是通过构造函数接收它们作为参数。这样,我们可以在应用程序的配置中注入具体的Coach和Player实例,实现了依赖的解耦。

例如,在Spring框架中,我们可以使用XML配置文件或注解来配置依赖注入。在配置文件中,我们可以指定具体的对象实例:

7. 怎么理解注入集合对象?

还是举一个例子:

假设我们有一个NBA球队管理系统,其中球队需要管理一组球员(Players)。我们希望通过依赖注入来将球员集合注入到球队对象中。

首先,我们定义一个Player类表示球员:

然后,我们定义一个Team类表示球队,它依赖于一个Player集合。我们可以使用构造函数注入或者属性注入来实现集合对象的注入。

(1)使用构造函数注入集合对象:

在上述代码中,Team类通过构造函数接收一个Player集合作为参数,并将其赋值给类的属性。通过遍历集合对象,我们可以依次调用每个球员的play()方法。

(2)使用属性注入集合对象:

在上述代码中,Team类提供了一个setter方法来接收Player集合对象,并将其赋值给类的属性。通过调用setter方法,我们可以将集合对象注入到Team类中。

无论是构造函数注入还是属性注入,我们都可以在使用依赖注入框架(如Spring)时配置集合对象的注入。例如,在Spring框架中,我们可以使用XML配置文件或注解来配置集合对象的注入。

XML配置文件的示例:

通过上述配置,Spring容器会自动创建Player对象并注入到Team类的players属性中。

后记

对于SpringAOP编程以及Spring JDBC这两个知识点,请看下篇文章!

【面向切面编程AOP】从0开始学习Spring---AOP的相关知识(2)-CSDN博客

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

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

相关文章

灵敏可靠的缓激肽(Bradykinin)ELISA检测试剂盒

灵敏可靠的ELISA试剂盒&#xff0c;用于检测血浆、血清和尿液样本中的缓激肽 缓激肽&#xff08;Bradykinin&#xff09;于1949年被发现&#xff0c;由血浆中的球蛋白前体在蛋白酶的作用下生成。它的名字表明它会促使肠道缓慢运动。早在1909年&#xff0c;人们就注意到在尿液中…

动态内存管理(2)

文章目录 4. 几个经典的笔试题4.1 题目14.2 题目24.3 题目34.4 题目4 5. C/C程序的内存开辟6. 动态通讯录7. 柔性数组7.1 柔性数组的特点7.2 柔性数组的使用7.3 柔性数组的优势 4. 几个经典的笔试题 4.1 题目1 #include <stdio.h> #include <stdlib.h> #include …

【极数系列】Flink集成KafkaSink 实时输出数据(11)

文章目录 01 引言02 连接器依赖2.1 kafka连接器依赖2.2 base基础依赖 03 使用方法04 序列化器05 指标监控06 项目源码实战6.1 包结构6.2 pom.xml依赖6.3 配置文件6.4 创建sink作业 01 引言 KafkaSink 可将数据流写入一个或多个 Kafka topic 实战源码地址,一键下载可用&#xf…

零代码3D可视化快速开发平台

老子云平台 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。此技术已经在全球申请了专利…

李宏毅LLM——生成式学习的两种策略

文章目录 生成式学习的两种策略&#xff1a;各个击破和一次到位成为专才&#xff1a;成为通才神秘的 In-context Learning 能力Instruction LearningChain of Thought Prompting 生成式学习的两种策略&#xff1a;各个击破和一次到位 对应视频的 P7-P11 生成有结构的复杂物件也…

(2)(2.14) SPL Satellite Telemetry

文章目录 前言 1 本地 Wi-Fi&#xff08;费用&#xff1a;30 美元以上&#xff0c;范围&#xff1a;室内&#xff09; 2 蜂窝电话&#xff08;费用&#xff1a;100 美元以上&#xff0c;范围&#xff1a;蜂窝电话覆盖区域&#xff09; 3 手机卫星&#xff08;费用&#xff…

React+Echarts实现数据排名+自动滚动+Y轴自定义toolTip文字提示

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 1、导入所需组…

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…

uniapp 本地存储的方式

1. uniapp 本地存储的方式 在uniapp开发中&#xff0c;本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据&#xff0c;以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式&#xff0c;以及相关的代码示例。 1.1. 介绍 在移动应用开发…

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛&#xff08;2024 美赛&#xff09;B 题&#xff1a; 2024 MCM 问题 B: 搜寻潜水艇 题目翻译&#xff1a; Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司&#xff0c;专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

git小白进阶之路

git是最常用的版本控制工具&#xff0c;我对其进行了整理后续补充&#xff0c;这个文档欢迎大家来讨论&#xff0c;当前我的视频梳理&#xff1a; git小白进阶之路_哔哩哔哩_bilibili&#xff0c;非常希望大佬们能够批评指正&#xff0c;并多多交流。 目录 初始配置 配置账号…

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LSSVM卷积神经…

python二维数组初始化的一个极其隐蔽的bug(浅拷贝)

初始化一个三行三列的矩阵 m n 3初始化方式1 a [[0 for i in range(m)] for j in range(n)]初始化方式2 b [] row [0 for i in range(0,m)] for i in range(0,n):b.append(row)分别输出两个初始化的结果 for row in a:print(row) for row in b:print(row)当前的输出为…

大华 DSS 数字监控系统 attachment_getAttList.action SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/attachment_getAttList.action 路由发送特殊构造的数据包,利用报错注入获…

2024-02-06(Sqoop)

1.Sqoop Apache Sqoop是Hadoop生态体系和RDBMS&#xff08;关系型数据库&#xff09;体系之间传递数据的一种工具。 Sqoop工作机制是将导入或者导出命令翻译成MapReduce程序来实现。在翻译出的MapReduce中主要是对inputformat和outputformat进行定制。 Hadoop生态包括&#…

MATLAB环境下生成对抗网络系列(11种)

为了构建有效的图像深度学习模型&#xff0c;数据增强是一个非常行之有效的方法。图像的数据增强是一套使用有限数据来提高训练数据集质量和规模的数据空间解决方案。广义的图像数据增强算法包括&#xff1a;几何变换、颜色空间增强、核滤波器、混合图像、随机擦除、特征空间增…

告别mPDF迎来TCPDF和中文打印遇到的问题

mPDF是一个用PHP编写的开源PDF生成库。它最初由Claus Holler创建&#xff0c;于2004年发布。原来用开源软件打印中文没有问题&#xff0c;最近发现新的软件包中mPDF被TCPDF代替了&#xff0c;当然如果只用西文的PDF是没有发现问题&#xff0c;但要打印中文就有点抓瞎了如图1&am…

选择大语言模型:2024 年开源 LLM 入门指南

作者&#xff1a;来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞&#xff0c;这绝对是轻描淡写的说法。数千种新的人工智能工具被推出&#xff0c;人工智能功能被添加到现有的应用程序中&#xff0c;好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

vue3项目中使用mapv

vue3项目中使用mapv mapv是百度地图官方提供的地图数据可视化开源项目&#xff0c;提供了很多效果酷炫的绘图api mapv地址在这里&#xff0c;示例图在这里 先解释为什么要用mapv echarts画的地图&#xff0c;都是行政区划&#xff0c;就算是geo地图&#xff0c;也只能在行政…