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

news2025/1/20 3:50:43

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;
    @Autowired
    public 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 {

 @Bean
  public TeaStore teaStore() {
     return new TeaStore();
  }
}

五、HelloWorld示例

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

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

六、结语

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

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

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

相关文章

Unity中URP下的添加雾效支持

文章目录 前言一、URP下Shader支持雾效的步骤1、添加雾效变体2、在Varying结构体中添加雾效因子3、在顶点着色器中&#xff0c;我们使用内置函数得到雾效因子4、在片元着色器中&#xff0c;把输出颜色 和 雾效因子混合输出 二、在Unity中打开雾效三、测试代码 前言 我们使用之…

mapboxgl 中热力图的实现以及给热力图点增加鼠标移上 popup 效果

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章还是关于最近做到的 mapboxgl 地图展开的。 借鉴官方示例&#xff1a;https://iclient.supermap.io/examples/mapboxgl/editor.html#heatMapLayer 效果预览 技术思路 将接口数据渲染到地图中形成热力图。还需要将热…

机器学习深度学习面试笔记

机器学习&深度学习面试笔记 机器学习Q. 在线性回归中&#xff0c;如果自变量之间存在多重共线性&#xff0c;会导致什么问题&#xff1f;如何检测和处理多重共线性&#xff1f;Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)&#xff1f;它们与普通线性回…

西北大学844计算机类考研-25级初试高分总攻略

西北大学844计算机类考研-25级初试高分攻略 个人介绍 ​ 本人是西北大学22级软件工程研究生&#xff0c;考研专业课129分&#xff0c;过去一年里在各大辅导机构任职&#xff0c;辅导考研学生专业课844&#xff0c;辅导总时长达400小时&#xff0c;辅导学生超过20余人&#xf…

交换域系数的选择:图像处理与编码的关键策略

在图像处理和编码领域&#xff0c;选择适当的交换域系数对于实现高效的图像处理和编码至关重要。交换域系数是指在特定的数学变换下产生的频域系数。通过选择合适的交换域系数&#xff0c;可以实现图像的压缩、增强和重构。本文将深入探讨交换域系数的选择在图像处理和编码中的…

中小企业运营难题:CRM系统为您解决!

​CRM如何帮助中小企业解决业务与团队之间的问题&#xff1f;它可以帮助企业获取潜在客户、数据储存管理、建立标准化流程、减少客户流失、促进客户沟通等。客户关系管理的核心理念要以客户为最主要的资源&#xff0c;提供全面的客户服务&#xff0c;满足客户要求&#xff0c;实…

如何从huggingface上下载模型

现在通过git 的方式已经几乎下载不到huggingface上的东西了。不过我们还可以使用huggingface-cli实现快速下载&#xff0c;以openlm-research/open_llama_3b_v2为例。 首先安装huggingface-cli pip install -U huggingface_hub 接下来使用&#xff1a; huggingface-cli downloa…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述&#xff1a; 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际&#xff0c;本周&#xff0c;传统汽车巨头丰田公司宣布&#xff0c;将出售部分电装&#xff08;Denso&#xff09;公司股份&#xff0c;资金用于投入电动化、智能驾驶等新技术研发。 按照计划&#xff0c;丰田汽车拟出售超过…

python之Selenium WebDriver安装与使用

首先把python下载安装后&#xff0c;再添加到环境变量中&#xff0c;再打开控制台输入: pip install selenium 正常情况下是安装好的&#xff0c;检查一下“pip show selenium”命令&#xff0c;出现版本号就说明安装好了。 1&#xff1a;如果出现安装错误&#xff1a; 那就用“…

2024年HTML+CSS+JS 网页版烟花代码

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 直接跳到末尾 获取完整源码 在线体验地址&…

【docker实战】02 用docker安装mysql

本示例采用bitnami的镜像进行安装MySQL 一、镜像搜索 先搜索一下mysql有哪些镜像 [rootlocalhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql …

操作系统【设备管理】

设备管理 一、前言 学习了存储器管理后&#xff0c;继续学习设备管理&#xff0c;设备管理的主要功能有缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等&#xff0c;由于I/O设备不仅种类繁多&#xff0c;而且他们的特性和操作方式往往相差甚大&#xff0c;使得设…

leetcode贪心算法题总结(一)

此系列分三章来记录leetcode的有关贪心算法题解&#xff0c;题目我都会给出具体实现代码&#xff0c;如果看不懂的可以后台私信我。 本章目录 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列5.最长递增子序列6.递增的三元子序列7.最长连续递增序列8.买卖股票的最…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

数据探查系列:如何进行有意义的探索性数据分析(EDA)

如何进行有意义的探索性数据分析&#xff08;EDA&#xff09; 目录 1. 设置 1.1 导入库1.2 导入数据1.3 数据集特征1.4 数据集属性 2. 探索训练集和测试集 2.1 训练集 - 快速概览2.2 训练集 - 基本统计2.3 测试集 - 快速概览2.4 测试集 - 基本统计 3. 特征分布4. 数据不平衡检查…

【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代

目录 前言 机器视觉 缺陷检测 工业上常见缺陷检测方法 内容简介 作者简介 目录 读者对象 如何阅读本书 获取方式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 机器视觉…

深入探索MongoDB集群模式:从高可用复制集

MongoDB复制集概述 MongoDB复制集主要用于实现服务的高可用性&#xff0c;与Redis中的哨兵模式相似。它的核心作用是数据的备份和故障转移。 复制集的主要功能 数据复制&#xff1a;数据写入主节点&#xff08;Primary&#xff09;时&#xff0c;自动复制到一个或多个副本节…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

Spring Boot 中的虚拟线程

在本文中&#xff0c;我将讨论 Spring Boot 中的虚拟线程。 什么是虚拟线程&#xff1f; 虚拟线程作为 Java 中的一项功能引入&#xff0c;旨在简化并发性。 Virtual threads 是 轻量级的线程&#xff0c;由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且…