Spring系列学习三、Spring的基础组件

Spring的基础组件

  • 一、 什么是Bean及Bean的生命周期
  • 二、 什么是依赖注入(DI)与控制反转(IOC)
  • 三、 Spring的作用域与生命周期
  • 四、 Spring的配置方式(XML与基于注解的配置)
  • 五、HelloWorld示例
  • 六、结语

欢迎回来各位亲爱的小伙伴!我们已经滑过Spring的门槛,现在我们要深入学习Spring框架中的基础组件。抓紧坐稳,让我们开始本次的知识之旅!

一、 什么是Bean及Bean的生命周期

在Spring大家庭中,Bean就像是家中的重要一员。何为Bean呢?Bean相当于是普通Java类的兄弟,这个兄弟有点特别,他被Spring容器创建、管理并且他还决定了他们的生命周期。生命周期,这个好听的词就像是一部好莱坞大片,其实也差不多。Bean的生命周期中包含了实例化、初始化、使用以及销毁等步骤。养成良好的生活习惯,了解清楚他们的生命周期,这样Bean们才能更好地为我们服务。

我们前面已经提到,Bean在Spring框架中扮演了一个重要的角色。它们是Spring框架的基本组成块。如同世间万物一样,Bean有自己的生命周期,下面是一个具体的例子:
实例化(Instantiation): Bean开始它的生命周期。比如,我们可以通过构造器(Constructor)或工厂方法(Factory method)来实例化一个Bean。

public class HelloWorld {private String message;//Getters and Setters
}

初始化(Initialization): 一旦Bean被实例化,它就会通过Spring的依赖注入(DI)机制进行初始化。
使用(Usage): 当所有的初始化都完成以后,Bean就可以被应用程序使用了。
销毁(Destruction): Bean的生命周期结束,Spring容器将调用Bean的销毁方法。
我们可以通过覆盖Bean的@PostConstruct和@PreDestroy方法来在生命周期的不同阶段进行一些自定义操作。

二、 什么是依赖注入(DI)与控制反转(IOC)

别被这些专业术语吓破胆,虽然他们俩是Spring中重要的两个概念,其实很easy了。
依赖注入(DI),顾名思义,就是把依赖的东东注入到需要的组件中。想象一下,你在厨房做饭,现在需要用到水,你可以自己到井里打水,但是这明显不现实。然后你想到了水龙头,打开水龙头就有水了,水龙头就像Spring,把需要的东西(比如,服务、组件等)送到你手里,这就是依赖注入。

说完DI,就不得不说说它的好朋友,控制反转(IOC)。IOC其实是DI的另一种表达,把本来由我们自己来控制的东西交给别人来处理(使用对象时,原本需要new出来,现在不用了,直接从spring取),相当于是把控制权从自己手中反转给了别人,这就叫控制反转。DI和IOC都是Spring用来把活动分配给Java中的各个角色的方式。

让我们用一个实例来理解依赖注入(DI)的概念。假设我们有一个TextEditor类和一个SpellChecker类。在没有Spring的情况下,我们可能这样使用它们:

class TextEditor {private SpellChecker checker;public TextEditor() {this.checker = new SpellChecker();}
}

但Spring提倡“不要找依赖,依赖就应该找到你”。所以,使用Spring和DI,我们的代码如下:

@Component
class TextEditor {private SpellChecker checker;@Autowiredpublic TextEditor(SpellChecker checker) {this.checker = checker;}
}

这就是DI的力量。它让TextEditor“逃脱”了创建SpellChecker实例的繁琐。

三、 Spring的作用域与生命周期

我总是告诫大家,每个Bean都是个有生命的实体,他有自己的生命周期,包括出生、成长、成熟和消亡。同样的,Spring容器也是如此。它为内部的Bean提供了六种作用域:
在这里插入图片描述

Spring容器给我们提供了这么多选择,那么我们就需要根据实际情况来仔细考虑当我们的Bean应该属于哪种作用域,多数情况下都是使用默认作用域 singlton(单例模式),偶尔会使用 prototype(原型模式),其他四个作用域用的较少。

关于Spring的作用域,让我们具体解释一下,并提供一个例子。假设我们有一个名为shoppingCart的Bean,它的作用域为"session"。那么每个用户会话都将有其自己的shoppingCart实例。如果将作用域改为"singleton",那么所有的用户会话将共享同一个shoppingCart实例,这是不合理的。

@Configuration
public class AppConfig {@Bean@Scope("prototype")public ShoppingCart shoppingCart() {return new ShoppingCart();}
}

四、 Spring的配置方式(XML与基于注解的配置)

Spring对Bean的管理支持两种方式,XML与注解的方式,本着,能简单就不要复杂,现在多数都
不想写一堆繁琐的XML配置文件,而是使用注解的方式,通过简简单单的一行注解,就可以完成很多复杂的事情。相比之下,XML配置方式虽然看起来难度较大,但实际上在某些场合,如需要集中管理大量的配置信息或配置改动频繁的时候,使用XML则有更好的维护性和稳定性。

最后,让我们看一个基于XML和基于注解的配置的例子。假设我们要注册一个名为"teaStore"的Bean。

<bean id="teaStore" class="com.example.TeaStore"/>

这是XML方式的配置,而在注解配置方式下:

@Configuration
public class AppConfig {@Beanpublic TeaStore teaStore() {return new TeaStore();}
}

五、HelloWorld示例

1、创建项目,并引入spring依赖;
在这里插入图片描述
在这里插入图片描述

2、创建HelloWorldService并交给Spring管理
在这里插入图片描述
在这里插入图片描述
3、在main方法中,从Spring中获取helloWorldService Bean,并调用其方法输出;
在这里插入图片描述

六、结语

通过本章的学习和实践,我想你已经明了Spring中的Bean的生命周期,关键是如何使用,同时依赖注入和控制反转又是如何帮助我们简化编程的,还有那些作用域和配置方式又是如何影响我们的编程的。我期待你在接下来的学习中,能够把这些知识应用到实践中去,让这些理论知识转变为你解决问题的有力武器。

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

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

相关文章

laravel api资源的问题记录

resource 转换层 可以帮助我们转换一些字段的结果&#xff0c;类似前端的filter。 可以使用比如对象或者模型的形式来处理&#xff0c;但使用sql查询会导致n1的问题。如图&#xff1a; 层次嵌套很多&#xff0c;而且很深&#xff0c;这样虽然开发方便了&#xff0c;但是维护就…

大华NVR和IPC通过主动注册协议方式接入AS-V1000视频监控平台的步骤

最近有人经常用到有的型号的大华网路摄像机&#xff0c;不支持国标GB28181标准&#xff0c;问我们能否接入到在公网的AS-V1000平台 &#xff1f; 我们早期就开发了大华的主动注册协议SDK&#xff0c;能够支持大华的NVR和IPC接入到AS-V1000平台。 今天就直接讲解如何一步步的把局…

【ES6】Class继承-super关键字

目录 一、前言二、ES6与ES5继承机制区别三、super作为函数1、构造函数this1&#xff09;、首先要明确this指向①、普通函数②、箭头函数③、注意事项 2&#xff09;、其次要明确new操作符做了哪些事情 2、super()的用法及注意点1&#xff09;、用法2&#xff09;、注意点 四、s…

【Docker-Dev】Mac M2 搭建docker mysql

Mac M2 搭建Mysql 1、前言2、前置说明-Docker的代理访问3、前置说明-Mysql的镜像访问3.1、提取信息3.1.1、开启Mysql的实例3.1.2、Dokcer连接Mysql3.1.3、官方简易版的docker-compose3.1.4、如何登录mysql bash3.1.5、自定义my.cnf文件3.1.6、如何知道其他自定义配置项 4、M2安…

LeetCode刷题--- 有效的数独

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主…

什么是负载均衡?

负载均衡是指在计算机网络领域中&#xff0c;将客户端请求分配到多台服务器上以实现带宽资源共享、优化资源利用率和提高系统性能的技术。负载均衡可以帮助小云有效解决单个服务器容量不足或性能瓶颈的问题&#xff0c;小云通过平衡流量负载&#xff0c;使得多台服务器能够共同…

模式识别与机器学习(十二):Stacking

原理 在本次实验中以决策树、svm和随机森林为基学习器&#xff0c;以决策树为元学习器。 Stacking的做法是首先构建多个不同类型的一级学习器&#xff0c;并使用他们来得到一级预测结果&#xff0c;然后基于这些一级预测结果&#xff0c;构建一个二级学习器&#xff0c;来得到…

基于MATLAB的泊松分布,正态分布与伽玛分布(附完整代码与例题)

目录 一. 泊松分布 1.1 理论部分 1.2 MATLAB函数模型 1.3 例题 二. 正态分布 2.1 理论部分 2.2 MATLAB函数模型 2.3 例题 三. 伽玛分布 3.1 理论部分 3.2 MATLAB函数模型 3.3 例题 一. 泊松分布 1.1 理论部分 Poisson分布是离散的&#xff0c;其x值只能取自然数。…

const和constexpr

constexpr 是 C 11 标准新添加的关键字&#xff0c;在此之前&#xff08;C 98/03标准&#xff09;只有 const 关键字&#xff0c;其在实际使用中经常会表现出两种不同的语义&#xff08;常量和只读&#xff09;。 dis_1() 函数中的“const int x”只是想强调 x 是一个只读的变量…

Neo4j 5建库

Neo4j 只有企业版可以运行多个库&#xff0c;社区版无法创建多个库&#xff0c;一个实例只能运行一个库&#xff1b; 如果业务需要使用多个库怎么办呢&#xff1f; 就是在一个机器上部署多个实例&#xff0c;每个实例单独一个库名 这个库的名字我们可以自己定义&#xff1b; …

Hadoop之HDFS 详细教程

1、HDFS概述 Hadoop 分布式系统框架中&#xff0c;首要的基础功能就是文件系统&#xff0c;在 Hadoop 中使用FileSystem 这个抽象类来表示我们的文件系统&#xff0c;这个抽象类下面有很多子实现类&#xff0c;究竟使用哪一种&#xff0c;需要看我们具体的实现类&#xff0c;在…

实战13 分配角色

目录 1、分配角色思路 2、分配角色回显接口实现 3、分配角色回显前端实现 3.1 编写前端api脚本代码 3.2 编写分配角色窗口代码 3.3 编写分配角色回显脚本代码 4、分配角色后端接口 4.1 UserRoleDTO 4.2 UserMapper 4.3 UserMapper.xml 4.4 UserService 4.5 UserServ…

ASP.Net实现新闻添加查询(三层架构,含照片)

目录 演示功能&#xff1a; 点击启动生成页面 点击搜索模糊查询 点击添加跳转新界面 ​编辑 点击Button添加 步骤&#xff1a; 1、建文件 ​编辑 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper&#xff08;对数据库进行操作…

vue3+elementPlus:el-drawer新增修改弹窗复用

在el-drawer的属性里设置:title属性&#xff0c;和重置函数 //html<!-- 弹窗 --><el-drawerv-model"drawer":title"title":size"505":direction"direction":before-close"handleClose"><el-formlabel-posit…

数据挖掘(作业3

任务一 对以下数据集使用K均值聚类算法&#xff1a; 1&#xff09;观察实验结果是否符合预期&#xff1b; 2&#xff09;利用SSE标准确定K值&#xff1b; 3&#xff09;自行调参并观察对聚类结果的影响。 注意&#xff1a;需要把类别信息去掉。 “tutorial3_Data Explorat…

HTTP代理服务器:Go语言下的“网络翻译官”

开场白&#xff1a;在这个全球化的网络时代&#xff0c;有时我们需要一个“翻译官”来帮助不同系统、不同语言进行交流。今天&#xff0c;我们就来探讨如何使用Go语言&#xff0c;轻松实现这样一个角色——HTTP代理服务器&#xff0c;让我们的网络请求更加畅通无阻&#xff01;…

模式识别与机器学习-无监督学习-聚类

无监督学习-聚类 监督学习&无监督学习K-meansK-means聚类的优点&#xff1a;K-means的局限性&#xff1a;解决方案&#xff1a; 高斯混合模型&#xff08;Gaussian Mixture Models&#xff0c;GMM&#xff09;多维高斯分布的概率密度函数&#xff1a;高斯混合模型&#xff…

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一&#xff0c;题目二&#xff0c;方法1&#xff0c;方法一2&#xff0c;方法二3&#xff0c;方法三4&#xff0c;方法四 三&#xff0c;示例结果 一&#xff0c;题目 最高分最低分之差 输入n个成绩&#xff0c;换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

信息网络协议基础-IPv6协议

文章目录 概述为什么引入IP服务模型IPv4的可扩展性问题解决方法***CIDR(Classless Inter-Domain Routing, 无类别域间寻路)前缀汇聚***前缀最长匹配***NAT(网络地址转换)存在的问题解决方案路由表配置***局限性IPv6协议头标IPv6地址表示前缀类型单播地址链路局部地址(Link-Loca…

浅谈WPF之ToolTip工具提示

在日常应用中&#xff0c;当鼠标放置在某些控件上时&#xff0c;都会有相应的信息提示&#xff0c;从软件易用性上来说&#xff0c;这是一个非常友好的功能设计。那在WPF中&#xff0c;如何进行控件信息提示呢&#xff1f;这就是本文需要介绍的ToolTip【工具提示】内容&#xf…