了解Spring中Bean:配置与作用域

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。

文章目录

  • 前言
  • 一、什么是Bean?
  • 二、Bean的配置
      • 常用属性:
      • 常用子元素:
  • 三、Bean的作用域
  • 四、singleton和prototype作用域
      • 单例(singleton)作用域
      • 原型(prototype)作用域


前言

Spring如同一个工厂,用于管理Spring中的Bean。使用这个工厂我们需要对SPring的文件进行配置,采用XML文件的形式进行对Bean的讲解。下面我们就开始学习吧。


一、什么是Bean?

在Spring框架中,bean是指一个由Spring IoC容器实例化、组装和管理的对象。可以理解为是由Spring容器生成和控制生命周期的一个对象实例。Spring中的bean通常是普通的Java对象(POJOs),可以通过配置文件或者注解的方式来声明和配置。

Spring IoC容器负责创建bean,以及根据配置来注入依赖对象,这个过程通常称为依赖注入(Dependency Injection, DI)。依赖注入允许你的应用程序的不同部分松耦合,易于维护和测试。

Bean的作用范围和生命周期由Spring容器进行管理。根据配置,Spring可以为每次请求创建新的bean,也可以返回单例的bean,或是其他的作用域。

在Spring中定义bean有几种方式:

  1. XML配置文件 - 通过在XML中使用<bean>标签定义一个bean及其属性。

  2. 注解 - 使用注解(如@Component, @Service, @Repository, @Controller等)标注类,Spring扫描这些注解自动注册bean。

  3. Java配置类 - 使用@Configuration注解的类定义beans和注入依赖,可以使用@Bean注解在方法上返回对象的实例。

这些beans是构成你的应用的基础,可以用来创建服务层、数据访问层和其他业务逻辑。通过Spring框架的强大功能和轻量级容器支持,应用的配置和管理变得更加容易和灵活。

二、Bean的配置

在Spring的XML配置中,<bean>元素是用来定义一个bean的配置说明。它有若干属性和子元素,这些都用来精细地控制bean的创建和行为。

常用属性:

  1. id: 唯一标识一个bean的名称,可以用来在其他地方引用这个bean。
  2. class: bean实例对应的全限定类名(包含包名和类名)。
  3. scope: 定义bean的作用域,如singleton(单例,默认值),prototype(多例),request,session等。
  4. constructor-arg: 用来通过构造函数注入依赖。
  5. property: 用来通过Setter方法注入依赖。
  6. lazy-init: 是否延迟初始化bean,只有在真正使用到时才创建bean实例,默认值是false。
  7. autowire: 自动装配模式,默认值是no,其他值包括byName,byType,constructor,autodetect。

常用子元素:

  1. constructor-arg: 定义传递给bean构造方法的参数。这个子元素可以包含<value><ref><idref>等元素来指定参数值。
  2. property: 定义通过setter方法注入到bean的属性。这个子元素同样可以包括<value><ref><idref>等元素。
  3. qualifier: 与autowire属性配合使用,指定自动装配时需要考虑的限定符。
  4. lookup-method: 用于获取动态地返回bean实例的方法。
  5. replaced-method: 用于在运行时替换方法逻辑的配置。

<bean>的简单XML配置示例,说明了如何使用这些元素和属性:

<beans><!-- 定义一个单例的bean --><bean id="myBean" class="com.example.MyClass" scope="singleton"><!-- 通过构造器注入,引用了另一个名为 myDependency 的bean --><constructor-arg ref="myDependency"/><!-- 设置属性,直接使用值 --><property name="exampleProperty" value="Hello World"/><!-- 延迟初始化 --><property name="lazyInit" value="true"/><!-- 设置属性,引用了另一个bean --><property name="anotherBean" ref="myOtherBean"/></bean><!-- 定义依赖项 --><bean id="myDependency" class="com.example.MyDependency"/><bean id="myOtherBean" class="com.example.MyOtherClass"/>
</beans>

在这个例子中,myBean是一个单例的bean,它有一个通过构造器注入依赖的myDependency,还有两个属性:examplePropertyanotherBean。其中lazy-init被设置为true,意味着myBean将在首次请求时初始化。其他定义的bean参考了这个bean需要的依赖。

三、Bean的作用域

在Spring框架中,bean的作用域定义了bean实例的生命周期和可见性。不同的作用域可以应用于不同的情景,以下是Spring支持的几种主要的作用域:

  1. singleton:单例作用域是Spring中默认的作用域。对于在单例作用域中定义的每个bean,Spring IoC容器只会创建一个共享的bean实例,并且所有的请求都返回同一个bean实例。这适用于无状态的bean。

  2. prototype:原型作用域会让每次请求都创建一个新的bean实例,即每次调用Spring容器的getBean()方法时,都会返回一个全新的对象,适用于所有的状态都是非共享的bean。

  3. request:在Web应用中,对每个HTTP请求都可以创建一个bean实例,该作用域仅在基于web的Spring ApplicationContext中有效。

  4. session:在Web应用中,对每个HTTP会话都可以创建一个bean实例,该作用域也仅在基于web的Spring ApplicationContext中有效。

  5. application:在Web应用中,对每个ServletContext都创建一个bean实例,该作用域也仅在基于web的Spring ApplicationContext中有效。

  6. websocket:在WebSocket应用中,对每个WebSocket会话都创建一个bean实例,也仅在基于web的Spring ApplicationContext中有效。

选择正确的作用域对于管理应用程序中bean的生命周期是非常重要的,特别是在涉及到线程安全和资源管理的时候。例如,一个具有状态(stateful)的对象不应该被声明为单例,因为它在多个请求之间不能共享。而原型作用域适用于所有状态都是独立的情况下。

在配置文件或注解中定义bean作用域(如使用@Scope注解)时,可以根据需要选择上述作用域中的任一个。

四、singleton和prototype作用域

单例(singleton)作用域

单例作用域是Spring默认的作用域,确保在Spring IoC容器中只为每个Spring Bean定义创建一个实例。无论你多少次请求同一个Spring Bean,都将接收同一个实例,即该特定bean的唯一实例。单例作用域最适用于无状态的服务,例如配置服务或数据库服务。

示例代码(XML配置):

<bean id="singletonService" class="com.example.SingletonService" scope="singleton"/>

示例代码(注解):

@Component
@Scope("singleton")
public class SingletonService {// 类成员和方法
}

在这个例子中,SingletonService类是以单例的方式在Spring容器中注册的。无论你何时通过容器获取singletonService,它总是返回同一个实例。

原型(prototype)作用域

原型作用域将导致Spring容器为每次请求都创建一个新的bean实例。换句话说,每次调用Spring容器的getBean()方法时,它都会创建一个新的对象实例。原型作用域适合那些定义状态的对象,这些对象不应该被不同的依赖关系共享。

示例代码(XML配置):

<bean id="prototypeService" class="com.example.PrototypeService" scope="prototype"/>

示例代码(注解):

@Component
@Scope("prototype")
public class PrototypeService {// 类成员和方法
}

在这个例子中,每当从Spring容器请求PrototypeService时,就会创建一个新的PrototypeService实例。

在开发使用Spring框架的应用程序时,理解并正确使用这些作用域非常关键,因为它们对应用程序的性能和行为有显著影响。单例作用域用于共享不变的共享资源,而原型作用域用于每个使用时都有不同状态的场景。

感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

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

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

相关文章

递归回溯剪枝-括号生成

LCR 085. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 一. 根据题意&#xff0c;分析出符合要求的括号组合需要满足以下两个条件&#xff1a; 1. 左括号数或者右括号数都不能超过 n&#xff1b; 2. 从最左侧开始的每一个子集&#xff0c;不可以出现右括号数大于左括号数&…

长期可用的文件二维码怎么做?在线制作可修改的文件活码

怎么做一个可以长期使用的文件二维码呢&#xff1f;现在通过二维码来传递文件是很流行的一种方式&#xff0c;将文件生成二维码后印刷上墙或者分享给他人都可以快速完成文件的传播&#xff0c;所以在下发通知、资料等方面用途较多。那么文件二维码该如何生成呢&#xff1f; 想…

Linux内存地址空间

目录 一、虚拟地址空间 1.虚拟地址空间的定义 2.虚拟地址空间的布局 二、内存壁垒 1.内存壁垒的定义​编辑 2.段错误 三、内存映射的建立与解除 &#xff08;1&#xff09;mmap &#xff08;2&#xff09;munmap &#xff08;3&#xff09;堆内存的分配和释放 1.sbrk …

Python中学习调试requests模块时出现的大坑(1)

为防止迷路: 学习机械相关,请关注公众号:南大盛联 学习软件,硬件,请关注公众号号:一训微课 cmd模式下 不知道上面这行的话,需要补课。 pip install requests 这个不知道的话,也要补课 pip是python的安装工具。 install是安装的意思 requests是我们需要安装的模…

sora会是AGI的拐点么?

©作者|谢国斌 来源|神州问学 OpenAI近期发布的Sora是一个文本到视频的生成模型。这项技术可以根据用户输入的描述性提示生成视频&#xff0c;延伸现有视频的时间&#xff0c;以及从静态图像生成视频。Sora可以创建长达一分钟的高质量视频&#xff0c;展示出对用户提示的精…

PoC免写攻略

在网络安全领域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起着重要的作用&#xff0c;并且在安全研究、漏洞发现和漏洞利用等方面具有重要的地位。攻击方视角下&#xff0c;常常需要围绕 PoC 做的大量的工作。常常需要从手动测试开始编写 PoC&#xff0c;再到实…

vue项目电商

这个项目功能有首页&#xff0c;分类&#xff0c;商品详情&#xff0c;购物车&#xff0c;用户注册、登录等等的实现&#xff0c;并且可以在手机上进行展示。 git仓库地址&#xff1a;https://gitee.com/BisShen/project.git

应用层http协议包解析与https加密策略解析

文章目录 一.应用层协议--http协议基础认知二.https协议加密策略解析加密策略1--通信双方只使用对称加密加密策略2--通信双方使用单方非对称加密加密策略3--通信双方都使用非对称加密加密策略4--非对称加密与对称加密配合使用中间人攻击数据签名与CA证书HTTPS数据安全认证的本质…

二维码门楼牌管理系统技术服务的分类与应用

文章目录 前言一、二维码门楼牌管理系统的分类二、二维码门楼牌管理系统的应用优势三、结论 前言 随着城市管理的精细化和智能化&#xff0c;二维码门楼牌管理系统成为了现代城市管理的重要工具。该系统将传统的门牌、楼牌、户牌与二维码技术相结合&#xff0c;实现了信息的快…

MySQL:常用的SQL语句

提醒&#xff1a;设定下面的语句是在数据库名为 db_book执行的。 一、创建表 1. 创建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 创建t_book表 USE db_book; C…

C语言-----动态内存管理(1)

1.引入 我们之前已经学习了几种开辟内存空间的方式&#xff1a; &#xff08;1&#xff09;int a10;开辟4个字节大小的空间 &#xff08;2&#xff09;int arr[10]{0}定义数组开辟了一串连续的空间 2.malloc和free (1)malloc开辟内存空间可能会失败&#xff0c;因此需要检查…

HTML5+CSS3+JS小实例:文字阴影还能这么玩

实例:文字阴影还能这么玩 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:形状裁剪)

用于对组件进行裁剪、遮罩处理。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形状对当…

中美加密监管突传“巨响”!比特币突破7万信号出现!马斯克一句话掀起大行情!

比特币本周触及64000美元高价&#xff0c;2月交易所储备减少近45000多枚比特币&#xff0c;市场将其解读为看涨70000美元的关键信号。中美加密监管传利好&#xff0c;香港加密牌照申请期限结束&#xff0c;已有24家机构入列待批&#xff0c;美国考虑允许比特币ETF及相关信托期权…

uview2中上传文件和若依前后端分离配合的代码

uview2中的上传文件需要配合着自己后端的上传的代码 uview2 代码&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后续自己封装let a uni.uploadFile({//自己的请求路径url: that.$baseURL /uploadAvater, //上传的文件filePath: tha…

Java | vscode如何使用命令行运行Java程序

1.在vscode中新建一个终端 2.在终端中输入命令 javac <源文件>此命令执行后&#xff0c;在文件夹中会生成一个与原java程序同名的.class文件。然后输入如下命令&#xff1a; java <源文件名称>这样java程序就运行成功了。&#x1f607;

LeetCode:2368. 受限条件下可到达节点的数目(dfs Java)

目录 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - …

02-Vue 计算属性与监听器与VUE-cli使用

1.计算属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

单源最短路的建图方式

1129. 热浪 - AcWing题库 这道题可以有三种方法来做&#xff0c;朴素版的dijkstra、堆优化版的dijkstra和spfa算法 &#xff08;1&#xff09;spfa算法 这里的队列用循环队列&#xff0c;而不是像模板那样用普通队列是因为它的队列长度不确定 import java.util.*;public class…

贝叶斯优化CNN分类(matlab代码)

贝叶斯优化CNN分类matlab代码 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集&#xff0c;比例为8:1:1 数据处理: 在数据加载后&#xff0c;对数据进行了划分&#xff0c;包括训练集、验证集和测试集&#xff0c;这有助于评估模型的泛化能力。 数据标准化…