【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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【类与对象(中)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 引用 常引用 5.赋值运算符重载 5.1…

Excel——高级筛选匹配条件提取数据

一、筛选多条件 Q&#xff1a;筛选多个条件&#xff0c;并将筛选出的内容复制到其他区域 点击任意一个单元格 点击【数据】——【筛选】——【高级筛选】 选择【将筛选结果复制到其他位置】——在【列表区域】 鼠标选择对应的区域位置&#xff0c;条件区域一定要单独写出来&a…

DevOps落地笔记-19|响应速度:天下武功,唯快不破

上一课时介绍一个团队应该具备什么样的能力&#xff0c;以及如何度量团队的交付效能。事实上&#xff0c;团队的能力在一定程度上反映了软件的交付能力&#xff1b;而响应速度则是企业能否快速占领市场的重要因素。试想一下&#xff0c;有两个企业都发现了市场上的机会&#xf…

【数据结构和算法】--- 基于c语言排序算法的实现(1)

目录 一、排序的概念及其应用1.1排序的概念1.2 排序的应用1.3 常见的排序算法 二、插入排序2.1直接插入排序2.2 希尔排序2.2.1 预排序2.2.2 缩小gap2.2.3 小结 三、选择排序3.1 直接选择排序3.2 堆排序 一、排序的概念及其应用 1.1排序的概念 排序&#xff1a; 所谓排序&…

作业2.6

一、填空题 1、一个类的头文件如下所示&#xff0c;num初始化值为5&#xff0c;程序产生对象T&#xff0c;且修改num为10&#xff0c;并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; public: Test(int); void sh…

Flink SQL Client 安装各类 Connector、Format 组件的方法汇总(持续更新中....)

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

京东首页移动端-web实战

设置视口标签以及引入初始化样式 <link rel"stylesheet" href"./css/normalize.css"><link rel"stylesheet" href"./css/index.css"> body常用初始化样式 body {width: 100%;min-width: 320px;max-width: 640px;margin:…

基于SpringBoot+Vue的实验室管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

没有联合和枚举 , C语言怎么能在江湖混 ?

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

Flutter学习(八)Flutter_Boost接入

背景 基于安卓的原生项目&#xff0c;进行Flutter的接入&#xff0c;进行混合开发。 参考链接 官方地址&#xff1a;link fullter_boost配置&#xff1a;link git代理配置&#xff1a;link kotlin语法集成&#xff1a;link 混合开发的坑&#xff1a;link 开发环境 as4…

Tauri 的基本使用笔记

文章目录 前言如何将 Tauri 集成到前端项目?进程间通信&#xff08;命令&#xff09;const invoke window.__TAURI__.invoke; 进程间通信&#xff08;事件&#xff09;前端 ⇒ RustRust ⇒ 前端我的疑问 开发时的一些技巧用代码打开前端的开发者工具让 Tauri 不要监听文件Rus…

UE4 C++ 动态加载类和资源

动态加载类和资源&#xff1a;指在运行时加载 .cpp void AMyActor::BeginPlay() {Super::BeginPlay();//动态加载资源UStaticMesh* MyTempStaticMesh LoadObject<UStaticMesh>(nullptr,TEXT("/Script/Engine.StaticMesh/Game/StarterContent/Shapes/Shape_NarrowC…

基于单片机的智能燃气灶控制系统设计

摘要&#xff1a;针对传统燃气灶存在不能防干烧、不能进行温度检测、不能进行火力自动调节等问题&#xff0c;设计了一种基于单片机控制的智能燃气灶&#xff0c;它通过单片机进行控制&#xff0c;由开关模块、测温模块、语音播报模块、火力控制模块和防空烧模块五个模块组成&a…

SpringBoot整合Knife4j接口文档生成工具

一个好的项目&#xff0c;接口文档是非常重要的&#xff0c;除了能帮助前端和后端开发人员更快地协作完成开发任务&#xff0c;接口文档还能用来生成资源权限&#xff0c;对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j&#xff08;基于…

博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;文章分类管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#…

C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

Bruce Schneier 1 河豚算法&#xff08;Blowfish Algorithm&#xff09; 河豚算法&#xff08;Blowfish Algorithm&#xff09;是1993年11月由Bruce Schneier设计的一个完全开源的算法。 Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。 Blowfish算法具…

AI交互数字人究竟适合什么领域使用?

AI交互数字人可以像真人一样拥有流畅的对话能力、连贯的肢体动作&#xff0c;并且在大模型的加持下&#xff0c;通过整合语音交互、自然语言理解、图像识别等AI交互数字人技术&#xff0c;数字人可以轻松为用户提供“面对面”的语音对话交互服务。 AI交互数字人&#xff0c;赋能…

【C语言——打印乘法口诀表】

乘法表&#xff1a; 我们可以定义一个i控制行的变化&#xff0c;外加看上图的表得知我们需要用到循环结构&#xff0c;i是行需要不停的加加&#xff0c;因此&#xff0c;for循环比较好用&#xff0c;可以用两个嵌套的循环&#xff0c;外层循环即用到的i表示的是每一行的打印&am…

【tgcalls】webrtc::Call的使用

call 是MediaManager的成员 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\MediaManager.hstd::unique_ptr<webrtc::Call> _call;MediaManager 内置网络模块:NetworkInterfaceImpl class NetworkInterfaceImpl : public cricket

Rust 数据类型使用注意点

文章目录 前言一、Rust 的数据类型基本数据类型&#xff1a;复合数据类型&#xff1a; 二、使用注意点&#x1f4e2;整型溢出 总结 前言 Rust 学习系列 &#xff0c;学习rust的数据类型。牢记其中的注意点&#x1f4e2; 一、Rust 的数据类型 Rust 提供了丰富的数据类型&#…