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

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

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

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

相关文章

Linux和Windows集群中部署HTCondor

目录 1、集群架构 2、HTCondor版本 3、Linux系统安装 3.1、HTCondor安装 3.2、中央管理节点配置 3.3、其他节点配置 4、Windwos系统安装 5、安全配置 6、参考 1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.6…

python3装饰器

装饰器 它允许你修改函数或类的行为&#xff0c;而不更改其源代码。实质上&#xff0c;装饰器是接受另一个函数作为参数并返回一个包装原始函数的新函数。这样&#xff0c;你可以在不修改原始函数的情况下&#xff0c;添加一些额外的功能或逻辑。 def time_cost(func):"…

Java 数组(详细)

目录 一、数组的概述 1. 数组的理解&#xff1a; 2. 数组相关的概念&#xff1a; 3. 数组的特点&#xff1a; 4. 数组的分类&#xff1a; 5.数据结构&#xff1a; 二、一维数组 1. 一维数组的声明与初始化 2. 一维数组元素的引用&#xff1a; 3. 数组的属性&#xff1…

期货开户金融期货的种类

金融期货概念及其种类有哪些&#xff1f;期货种类分为商品期货、金融期货、和期货期权。金融期货是期货的其中一个种类&#xff0c;它是以证券&#xff1b;货币、汇率&#xff0c;利率等金融产品作为买卖标的的期货品种。金融期货交易产生于本世纪70年代的美国市场&#xff0c;…

项目解决方案: 实时视频拼接方案介绍(中)

目 录 1.实时视频拼接概述 2.适用场景 3.系统介绍 4. 拼接方案介绍 4.1基于4K摄像机的拼接方案 4.2采用1080P平台3.0 横向拼接 4.2.1系统架构 4.2.2系统功能 4.2.3方案特色 4.2.4适用场景 4.2.5设备选型 4.3纵横兼顾&#xff0c;竖屏拼接 4.3.1系统…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分为两类&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;从配送中心&#xff08;depot&#xff09;取货运输货物到客…

VUE3:省市区联级选择器

一、实现效果 二、代码展示 <template><div class"page"><select v-model"property.province"><option v-for"item in provinces" :key"item">{{ item }}</option></select><select v-model&…

RabbitMQ-消息队列:优先级队列、惰性队列

20、优先级队列 在我们系统中有一个订单催付的场景&#xff0c;我们的客户在天猫下的订单&#xff0c;淘宝会及时将订单推送给我们&#xff0c;如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒&#xff0c;很简单的一个功能对吧。 但是&#xff0c;天猫商家对我…

Stable Cascade-ComfyUI中文生图、图生图、多图融合基础工作流分享

最近 ComfyUI对于Stable Cascade的支持越来越好了一些&#xff0c;官方也放出来一些工作流供参考。 这里简单分享几个比较常用的基础工作流。 &#xff08;如果还没有下载模型&#xff0c;可以先阅读上一篇Stable Cascade升级&#xff0c;现在只需要两个模型&#xff09; &a…

春游和女儿穿这套,超美

质感满满的牛仔套装&#xff0c;简直不要太好看 出游的时候亲子装考虑一下哈哈 经典版型&#xff0c;线条流畅&#xff0c;洋气又舒适 而且用的是防褪色的牛仔面料&#xff0c;耐脏又实穿 日常外出都可以穿&#xff0c;时髦又闲适 上衣做的真口袋实用又美观&#xff0c;版…

实战 | 使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)

导 读 本文主要介绍使用YOLOv8图像分割实现路面坑洞检测&#xff08;步骤 代码&#xff09;。 背 景 如上图所示&#xff0c;现实生活中路面坑洞对车辆和驾驶员安全来说存在巨大隐患&#xff0c;本文将介绍如何使用YoloV8图像分割技术来检测路面坑洞&#xff0c;从而提示驾…

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…

Leetcode3. 无重复字符的最长子串 -hot100

题目&#xff1a; 代码&#xff08;首刷看解析 2024年3月2日&#xff09;&#xff1a; 没能自解的原因是Alpahash.insert(s[right]); 放在for循环开头了&#xff0c;没能处理边界条件。 class Solution { public:int lengthOfLongestSubstring(string s) {// 滑动窗口int left…

overleaf上传到arxiv 参考文献无法引用(?)

记一下overleaf上传到arxiv的bug 参考文献无法引用&#xff08;&#xff1f;&#xff09; 因为需要上传bbl文件而不是bib 用overleaf生成bbl 另外需要将bbl和txt的文件名设置成一样的

Linux线程【互斥与同步】

目录 1.资源共享问题 1.1多线程并发访问 1.2临界区和临界资源 1.3互斥锁 2.多线程抢票 2.1并发抢票 2.2 引发问题 3.线程互斥 3.1互斥锁相关操作 3.1.1互斥锁创建与销毁 3.1.2、加锁操作 3.1.3 解锁操作 3.2.解决抢票问题 3.2.1互斥锁细节 3.3互斥…

C 嵌入式系统设计模式 18:临界区模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之四…

Java读取文件

读取文件为String 、访问链接直接跳转html 环境&#xff1a;SpringMVC 、前端jsp InputStreamReader FileInputStream fileInputStream new FileInputStream(formatFile.getHtmlpath());InputStreamReader reader new InputStreamReader(fileInputStream, StandardCharsets…

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

gif闪图如何在线生成?仅需三步在线制作gif闪图

Gif动态图片是一种通过连续播放的一系列图片来展示的。Gif动图的优势是体积小、传播速度快且不受限制。当我们想要将多张图片变成带有闪动效果的gif动图时应该怎么操作呢&#xff1f;这时候&#xff0c;只需要使用在线闪图制作&#xff08;https://www.gif.cn/&#xff09;网站…