【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.mzph.cn/news/671432.shtml

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

相关文章

vue实现查询搜索框下拉字典

字典表 前端页面显示 依据这个字典表实现动态查询 初始化数组 首先先在全局变量里定义一个数据存放查询出来的数据 data() {return {dicts: []};},生命周期 查询的时候是声明周期开始的时候&#xff0c;原本增删改查页面在生命周期开始的时候就查询了页面的数据获得了列表值…

ElasticSearch-SpringBoot整合ElasticSearch

六、SpringBoot整合ElasticSearch 1、浏览官方文档 1、查找跟ES客户端相关的文档 使用Java REST Client 选择Java Hight Level REST Client 2、创建项目的准备 1.找到原生的依赖 2.找到对象 3.分析这个类里面的方法 3、正式创建项目 1.创建工程 2.导入依赖 注意依赖版本…

Python 函数式编程进阶:map、filter、reduce

Python 函数式编程进阶&#xff1a;map、filter、reduce 介绍map 函数作用和语法使用 map 函数Lambda 函数的配合应用 filter 函数作用和语法使用 filter 函数Lambda 函数的结合运用 reduce 函数作用和语法使用 reduce 函数典型应用场景 介绍 在函数式编程中&#xff0c;map、…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

springboot与Elasticsearch版本兼容对比

首先 大家在下载 Elasticsearch 时 最好先弄清楚版本 因为 如果 Spring Boot 版本 不兼容 Elasticsearch 那就是到头一场空了 Elasticsearch 版本 6.x 可以兼容 Spring Boot 2.x Elasticsearch 版本 7.x 可以兼容 Spring Boot 2.x 3.x 4x Elasticsearch 版本 7.x 以及 8.x 可以…

Flask 入门4:Flask 模板

1. 前言 Flask 拥有丰富的扩展方法&#xff0c;且都有统一的特点&#xff1a;简单和即学即用。当我们要实现某个功能之前&#xff0c;可以提前去搜一搜这个功能包是否已经存在&#xff0c;这样也能帮助我剩下很多时间。那么要去哪里找到这些扩展包呢&#xff0c;这里推荐两个方…

5G智能卷烟工厂数字孪生可视化平台,推进烟草行业数字化转型

5G智能卷烟工厂数字孪生可视化平台&#xff0c;推进烟草行业数字化转型。随着5G技术的不断发展&#xff0c;智能卷烟工厂数字孪生可视化平台成为了推进烟草行业数字化转型的重要手段。该平台将5G技术与数字孪生技术相结合&#xff0c;实现了对卷烟生产全过程的实时监控、数据分…

ROE是什么?如何用ROE来分析企业?

ROE是什么&#xff1f; ROE&#xff0c;即净资产收益率&#xff08;Return on Equity&#xff09;&#xff0c;又称作股东权益报酬率、权益利润率&#xff0c;是净利润与平均股东权益的百分比&#xff0c;也称为净值报酬率、权益报酬率、权益利润率、净资产利润率&#xff0c;…

网络选择流程分析(首选网络类型切换流程)

首先是界面,我在此平台的界面如下: 对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异 然后点击切换按钮会调用到UniEnabledNetworkModePreferenceControlle…

用的到的linux-删除文件-Day3

前言&#xff1a; 上一节&#xff0c;我们讲到了怎么去移动文件&#xff0c;其中使用到两大类的脚本命令即cp和mv。各两种命令都可以完成移动&#xff0c;但是cp是复制粘贴的方式&#xff0c;可以选择原封不动的复制粘贴过来&#xff0c;即不修改文件及文件夹的创建时间等&…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块

044_http模块_创建HTTP服务端 hello&#xff0c;大家好&#xff0c;那这个小节我们来使用 nodejs 创建一个 http 的服务&#xff0c;有了这个 http 服务之后&#xff0c;我们就可以处理浏览器所发送过来的请求&#xff0c;并且还可以给这个浏览器返回响应。 顺便说一下&#x…

【Linux】线程Pthread的概念 | NPTL线程库函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;Linux系列专栏&#xff1a;Linux基础 &#x1f525; 给大家…

华为、清华等开源超高清、精准文生图模型,0.5秒极速生成!

华为诺亚方舟实验室、清华大学信息科技学院、大连理工、香港大学和Hugging Face的研究人员&#xff0c;联合开源了超高清文生图模型——PIXART-δ。 研究人员将潜在一致性模型&#xff08;LCM&#xff09;和创新控制架构ControlNet-Transformer集成在PIXART-δ中&#xff0c;在…

【LeetCode: 73. 矩阵置零 + 矩阵】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

使用Python语言生成区块链地址

# 单次运行 import binascii import sha3 from ecdsa import SigningKey, SECP256k1priv SigningKey.generate(curveSECP256k1) # 生成私钥 pub priv.get_verifying_key() # 生成公钥keccak sha3.keccak_256() keccak.update(pub.to_string()) # keccak_256哈希运算 addr…

vue配置开发环境和生产环境

在与src文件夹同级的地方增加两个文件 .env.development .env.production配置development和production两个文件 在.env.development中写&#xff1a; NODE_ENV development VUE_APP_NUM dev //VUE_APP_自己取名字在.env.production中写&#xff1a; NODE_ENV production…

linux k8s 源码编译及单集群测试

目录 概述实践安装插件docker 在线安装containerd安装二进制安装yum安装修改containder配置文件 cnietcdrsyncgo设置golang代理 安装CFSSL下载kubernetes代码编译启动本地单节点集群问题k8s没有被正常启动该如何k8s正常启动日志测试 结束 概述 此文详细说明在 centos 7上编译 k…

QT上位机:串口调试助手

前言 上位机的简单编写可以帮我们测试并完善平台&#xff0c;QT作为一款跨平台的GUI开发框架&#xff0c;提供了非常丰富的常用串口api。本文先从最简单的串口调试助手开始&#xff0c;编写平台软件的串口控制界面 工程配置 QT 串口通信基于QT的QSerialPort类&#xff0c;先在…

【halcon】write_image 图片保存

前言 write_image 是一个可以用来保存图片的算子&#xff0c;可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。 正文 参数&#xff1a; Image&#xff08;输入对象&#xff09;&#xff1a; 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cy…

druid配置wall导致无法批量sql

1、现象 2、原配置 spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:druid:stat-view-servlet:enabled: trueloginUsername: ***loginPassword: ***allow:web-stat-filter:enabled: truefilter:wall:conf…