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

news2024/9/22 11:35:46

在这里插入图片描述

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

文章目录

  • 前言
  • 一、什么是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.coloradmin.cn/o/1484274.html

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

相关文章

几种常见的自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在软件测试领域&#xff0c;自动化测试框架有很多&#xff0c;这里主要介绍几种常用的自动化测试…

程序员必备开发工具

Chat GPT的升级节奏让人们越来越惊讶的同时,也让大家感觉到了压力,在如此快节奏的互联网世界中,开发人员需要不断学习与更新知识,保持领先地位并高效地交付高质量软件。 无论是集成开发环境 (IDE)、版本控制系统、测试工具、协作平台还是文档工具,学习并掌握这些流行的顶…

嵌入式学习31-指针和函数知识回顾

1.指针&#xff1a; 1.提供一种间接访问数据的方法 2.空间没有名字,只有一个地址编号 2.指针: 1.地址:区分不同内存空间的编号 2.指针:指针就是地址,地址就是指针 3.指针变量:存放指针的变量称为指针变量,简称为指针 3.指针的定义: int *p NULL; …

mysql order by布尔盲注

什么是order by 在MySQL支持使用ORDER BY语句对查询结果集进行排序处理&#xff0c;使用ORDER BY语句不仅支持对单列数据的排序&#xff0c;还支持对数据表中多列数据的排序。语法格式如下 select * from 表名 order by 列名(或者数字) asc&#xff1b;升序(默认升序) selec…

Spark(1)-wordCount入门

1. 创建Maven项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

【DDD】学习笔记-实体和值对象:从领域模型的基础单元看系统设计

今天我们来学习 DDD 战术设计中的两个重要概念&#xff1a;实体和值对象。 这两个概念都是领域模型中的领域对象。它们在领域模型中起什么作用&#xff0c;战术设计时如何将它们映射到代码和数据模型中去&#xff1f;就是我们这一讲重点要关注的问题。 另外&#xff0c;在战略…

每日五道java面试题之mysql数据库篇(二)

目录&#xff1a; 第一题. 什么是索引&#xff1f;第二题. 索引有哪些优缺点&#xff1f;第三题. 创建索引的原则第四题. 创建索引时需要注意什么&#xff1f;第五题. 使用索引查询一定能提高查询的性能吗&#xff1f;为什么&#xff1f; 第一题. 什么是索引&#xff1f; 索引…

【前端素材】推荐优质后台管理系统网页my-Task平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使用。后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功…

查找算法——java

顺序查找&#xff08;顺序表查找&#xff09; 顺序查找也称为线形查找&#xff0c;属于无序查找算法。从数据结构线形表的一端开始&#xff0c;顺序扫描&#xff0c;依次将扫描到的结 点关键字与给定值k相比较&#xff0c;若相等则表示查找成功&#xff1b;若扫描结束仍没…

web服务器nginx下载及在win11的安装

一.背景 还是为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11 家庭版 mginx版本&#xff1a;1.24.0 二.nginx版本选择与下载 我之前也写过下载nginx下载_ngnix stable 下载-CSDN博客 不想看寻找过程的&#xff0c;直接点这里去下载https://nginx.org/download…

抖音视频评论抓取软件|视频批量下载

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过关键词进行搜索抓取&#xff0c;还能够通过分享链接进行单个视频的抓取和下载&#xff0c;让用户轻松获取抖音视频评论数据。 &#x1f50d; …

记录西门子:SCL博图

算术表达式: 关系表达式&#xff1a; 逻辑表达式&#xff1a; 赋值运算

云时代【6】—— 镜像 与 容器

云时代【6】—— 镜像 与 容器 四、Docker&#xff08;三&#xff09;镜像 与 容器1. 镜像&#xff08;1&#xff09;定义&#xff08;2&#xff09;相关指令&#xff08;3&#xff09;实战演习镜像容器基本操作离线迁移镜像镜像的压缩与共享 2. 容器&#xff08;1&#xff09;…

MSCKF3讲:后端理论推导(上)

MSCKF3讲&#xff1a;后端理论推导&#xff08;上&#xff09; 文章目录 MSCKF3讲&#xff1a;后端理论推导&#xff08;上&#xff09;1 MSCKF中的状态变量① IMU状态:② cam0状态&#xff1a;③ IMU和cam0间状态关系 2 微分方程递推&#xff08;数值解&#xff09;3 IMU状态预…

洛谷C++简单题小练习day22—小鱼记忆小程序!一题五解,高效学习

day22--小鱼记忆--2.26 习题概述 题目描述 小鱼最近被要求参加一个数字游戏&#xff0c;要求它把看到的一串数字 ai​&#xff08;长度不一定&#xff0c;以 0 结束&#xff09;&#xff0c;记住了然后反着念出来&#xff08;表示结束的数字 0 就不要念出来了&#xff09;。…

【高级数据结构】Trie树

原理 介绍 高效地存储和查询字符串的数据结构。所以其重点在于&#xff1a;存储、查询两个操作。 存储操作 示例和图片来自&#xff1a;https://blog.csdn.net/qq_42024195/article/details/88364485 假设有这么几个字符串&#xff1a;b&#xff0c;abc&#xff0c;abd&…

数字中国:构建智慧社会的未来蓝图

一、引言 随着信息技术的迅猛发展&#xff0c;数字中国已经成为推动社会进步、提升国家竞争力的重要引擎。数字中国不仅代表着信息技术的广泛应用&#xff0c;更代表着一种全新的社会形态和发展模式。在这个背景下&#xff0c;AI与大数据技术的融合与应用成为数字中国建设的核…

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验是模拟进程调度中的优先级算法&#xff0c;在先来先服务算法的基础上&#xff0c;只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU&#xff0c;将其从就绪队列中出队后。若此后队首的进程的…

PCIe(四)—— 物理层

在看完事务层和数据链路层之后,我们来继续我们的协议栈之旅吧!这一篇中,我们会来看看PCIe物理层(Physical Layer)是如何工作的,从而帮助我们更加深入的了解PCIe的数据传输。 1. 物理层(Physical Layer) 当数据链路层将上层数据封装好后,就会将其交给物理层进行传输。…

探讨苹果 Vision Pro 的 AI 数字人形象问题

Personas 的设计模糊性&#xff1a; 部分人认为这种模糊设计可能是出于安全考虑&#x1f6e1;️。安全角度&#xff1a;Personas 代表着你的 AI 数字形象&#xff0c;在创建时&#xff0c;它相当于你的 AVP&#xff08;生物识别扫描器的存在增加了冒充的难度&#xff09;。如果…