Spring 相关技术要点整理

以下是对 Bean 的作用域和生命周期的详细说明:

一、Bean 的作用域

  1. singleton(单例):

    • 这是默认的作用域。在整个应用中,对于特定的 Bean 类型,只会创建一个实例。
    • 无论在应用的哪个地方获取该 Bean,得到的都是同一个实例。
    • 优点是减少了对象创建的开销,适用于无状态的服务类等。例如,配置文件读取类,在整个应用中只需要一个实例来读取配置信息。
    • 缺点是如果 Bean 中有状态信息,可能会在不同的地方被意外修改。
  2. prototype(原型):

    • 每次从容器中获取该 Bean 时,都会创建一个新的实例。
    • 适用于有状态的对象,每个使用者都需要自己独立的实例。比如,用户会话对象,每个用户的会话应该是独立的,不能共享同一个实例。
    • 优点是可以保证每个使用者都有独立的对象,避免状态冲突。
    • 缺点是对象创建的开销较大,特别是在频繁获取该 Bean 的情况下。
  3. request

    • 在一次 HTTP 请求范围内有效。
    • 每个 HTTP 请求都会创建一个新的 Bean 实例,请求结束后,该实例会被销毁。
    • 适用于处理单个请求相关的对象,比如请求处理过程中的临时数据存储对象。
    • 可以方便地在请求处理的不同阶段传递和共享数据。
  4. session

    • 在用户会话范围内有效。
    • 从用户登录到退出的整个会话期间,同一个 Bean 类型只会有一个实例。
    • 适用于存储用户会话相关的信息,如用户登录状态、购物车等。
    • 可以在用户的整个会话过程中保持数据的一致性。
  5. global session

    • 在基于 portlet 的 Web 应用中,如果使用全局会话,这个作用域在全局会话范围内有效。
    • 与普通的 session 作用域类似,但应用场景更特定,适用于 portlet 环境下的全局会话。

二、Bean 的生命周期

  1. 实例化:

    • 这是 Bean 生命周期的第一步。容器根据配置信息创建 Bean 的实例。
    • 在 Java 中,可以通过构造函数、工厂方法等方式进行实例化。例如,使用默认构造函数创建一个简单的 Java 对象。
    • 代码中可能会通过反射机制调用构造函数来创建对象实例。
  2. 属性赋值:

    • 在实例化之后,容器会将配置好的属性值注入到 Bean 实例中。
    • 可以通过 setter 方法、构造函数参数等方式进行属性赋值。例如,在一个 Spring 应用中,通过 XML 配置文件或注解指定 Bean 的属性值,容器会自动将这些值注入到对应的 Bean 中。
    • 这一步确保 Bean 具有正确的初始状态和配置。
  3. 初始化:

    • 在属性赋值完成后,容器会调用 Bean 的初始化方法进行进一步的初始化操作。
    • 可以通过实现 InitializingBean 接口的 afterPropertiesSet 方法,或者在配置文件中指定 init-method 方法来进行初始化。例如,在一个数据库连接池的 Bean 中,可以在初始化方法中建立数据库连接。
    • 初始化操作可以包括资源的初始化、数据的加载、验证等。
  4. 使用:

    • Bean 被应用程序使用,执行其特定的业务逻辑。
    • 在应用程序中,可以通过依赖注入等方式获取 Bean 实例,并调用其方法来完成各种任务。例如,在一个服务层的 Bean 中,提供业务逻辑的实现方法,供控制器层调用。
  5. 销毁:

    • 当 Bean 不再需要时,容器会调用其销毁方法进行清理操作。
    • 可以通过实现 DisposableBean 接口的 destroy 方法,或者在配置文件中指定 destroy-method 方法来进行销毁操作。例如,在一个数据库连接池的 Bean 中,可以在销毁方法中关闭数据库连接,释放资源。
    • 销毁操作确保资源的正确释放,避免内存泄漏等问题。

三、代码

在 Spring Boot 中,可以使用注解来指定 Bean 的作用域。Spring 中主要有以下几种作用域:

1、singleton(单例)作用域

这是默认的作用域。在整个应用中,一个特定类型的 Bean 只有一个实例被创建。

使用方式如下:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
@Scope("singleton")
public class SingletonBean {//...
}

2、prototype(原型)作用域

每次请求这个类型的 Bean 时,都会创建一个新的实例。

示例代码:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
@Scope("prototype")
public class PrototypeBean {//...
}

三、request 作用域

在一次 HTTP 请求中,一个 Bean 实例被创建并只在该请求内有效。通常在 Web 应用中使用。

要使用 request 作用域,需要在配置类中启用@EnableWebMvc注解,并确保使用了AnnotationConfigWebApplicationContext来加载配置类,或者在 XML 配置中进行相应的配置。然后可以这样定义 Bean:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
@Scope("request")
public class RequestScopedBean {//...
}

四、session 作用域

在一个用户会话期间,一个 Bean 实例被创建并只在该会话内有效。同样通常在 Web 应用中使用。

配置和使用方式与 request 作用域类似:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
@Scope("session")
public class SessionScopedBean {//...
}

通过使用@Scope注解,可以方便地指定 Bean 的作用域,以满足不同的应用场景需求。

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

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

相关文章

【R语言】随机森林+相关性热图组合图

数据概况文末有获取方式 随机森林部分 #调用R包 library(randomForest) library(rfPermute) library(ggplot2) library(psych) library(reshape2) library(patchwork) library(reshape2) library(RColorBrewer) ​ ​ #读取数据 df<-read.csv("F:\\EXCEL-元数据\\2020…

深度学习之残差网络ResNet

文章目录 1. 残差网络定义2. 数学基础函数类3. 残差块4.ResNet模型5.训练模型6.小结 1. 残差网络定义 随着我们设计的网络越来越深&#xff0c;深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力。在这种网络中&#xff0c;添加层会使得网…

2010年国赛高教杯数学建模A题储油罐的变位识别与罐容表标定解题全过程文档及程序

2010年国赛高教杯数学建模 A题 储油罐的变位识别与罐容表标定 通常加油站都有若干个储存燃油的地下储油罐&#xff0c;并且一般都有与之配套的“油位计量管理系统”&#xff0c;采用流量计和油位计来测量进/出油量与罐内油位高度等数据&#xff0c;通过预先标定的罐容表&#…

JDBC的学习

一、JDBC DriverManager 二、JDBC connection 三、 JDBC Statement 1.DML 2.DDL 四、JDBC ResultSet 五、JDBC PreparedStatement

30.第二阶段x86游戏实战2-遍历周围-C++遍历二叉树(玩家角色基址)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)

系列文章目录 运维监控平台搭建 运维监控平台监控标签 golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置V1版本 文章目录 系列文章目录目的一、监控指标注册到consul的golang脚本开发1、修改settings.yaml文件2、修改config/ocnsul,go文件3、修改core/consul…

让你的MacOS剪切板变得更加强大,如何解决复制内容覆盖的问题

MacOS的日常使用过程中&#xff0c;肯定少不了复制粘贴&#xff0c;不论是文本内容还是文件&#xff0c;复制粘贴是避不开的操作&#xff0c;如果需要复制粘贴的内容不多&#xff0c;那么普通的复制粘贴就可以完成了&#xff0c;但是当有同样的内容需要输入不同的地方的时候&am…

C++的魔法世界:类和对象的终章

文章目录 一、再探构造函数二、类型转换2.1隐式类型转换2.2内置类型的类型转化2.3explicit关键字2.4多参数构造 三、static成员四、友元五、内部类内部类的特性 六、匿名对象 一、再探构造函数 类和对象(中)里介绍的构造函数&#xff0c;使用的是赋值实现成员变量的初始化。而…

出现接地故障电流现象,安科瑞ASJ剩余电流继电器可以避免吗?

什么是ASJ剩余电流继电器 剩余电流继电器是检测剩余电流&#xff0c;并将剩余电流值与基准值相比较的电器。当剩余电流值超过基准值时&#xff0c;它会发出一个机械开闭信号&#xff0c;使机械开关电器脱扣或声光报警装置发出报警。这种继电器通常基于漏电保护原理工作&#x…

【QAMISRA】解决导入commands.json时报错问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决导入commands.json时报错“Could not obtain system-wide includes and defines”的问题。 2、 问题场景 客户导入commands.json时报错“Could not obtain system-wide includes and defines”。 3、软硬件环境…

【保姆级教程】DolphinScheduler本地部署与远程访问详细步骤解析

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

海思hi3536c配置内核支持USB摄像头

linux内核版本&#xff1a;linux-3.18.20 配置步骤 进入Device Drivers 选择Multimedia support&#xff0c;并进入 选择Media USB Adapters&#xff0c;并进入 如下图&#xff0c;选择这几项&#xff1a; 保存退出&#xff0c;重新编译内核下载 内核更新后&#xff0c…

家里有宠物想去异味,希喂、米家、范罗士宠物空气净化器哪款去异味好?

宠物的便臭和体臭&#xff0c;其臭味浓度和持续性&#xff0c;相比于正常家居的其他臭味&#xff0c;祛除难度更大&#xff0c;建议就是选使用真正能高效除臭、分解异味分子的化学分解法除臭的宠物空气净化器。比如&#xff1a;光触媒分解除臭的。 不踩坑前置推荐 我从2020年…

docker-compose 部属netcore

一、准备镜像 编写&#xff1a;dockercompose.yml version: "3.4"services: saas.demo.api: image: harbor.net.com/demos/saas.demo.api:latestcontainer_name: saas.demo.apienvironment:- ASPNETCORE_ENVIRONMENTProductionports: - "5001:80" 部属&am…

CTFHUB技能树之HTTP协议——响应包源代码

开启靶场&#xff0c;打开链接&#xff1a; 是个贪吃蛇小游戏&#xff0c;看不出来有什么特别的地方 用burp抓包看看情况&#xff1a; 嗯&#xff1f;点击“开始”没有抓取到报文&#xff0c;先看看网页源代码是什么情况 居然直接给出flag了&#xff0c;不知道这题的意义何在 …

UE4 材质学习笔记06(布料着色器/体积冰着色器)

一.布料着色器 要编写一个着色器首先是看一些参考图片&#xff0c;我们需要找出一些布料特有的特征&#xff0c;下面是一个棉织物&#xff0c;可以看到布料边缘的纤维可以捕捉光线使得边缘看起来更亮 下面是缎子和丝绸的图片&#xff0c;与棉织物有几乎相反的效果&#xff0c;…

Docker 容器 数据卷 使用

目录 常用 命令 什么是数据卷以及特点 如何挂载数据卷 数据卷容器 数据覆盖问题 修改已经建立的数据卷关系 博主wx&#xff1a;yuanlai45_csdn 博主qq&#xff1a;2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信)&#xff0c;或者想要 cpp 方向修改简历&…

Linux——用户/用户组

创建用户组groupadd groupadd 用户组 删除用户组groupdel groupdel 用户组 创建用户useradd useradd 用户名 - g 用户组 useradd 用户名 -d HOME路径 删除用户userdel userdel 用户 userdel -r 用户 &#xff08;删除用户的 HOME 目录&#xff0c;不使用 -r &#xff0…

java项目之纺织品企业财务管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的纺织品企业财务管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于spring boot…

西门子网络程序传输,无需开通网络驱动器直接接入底层,支持各类数控 如发那科、三菱 、新代、海德汉、广数、精雕、马扎克等等

有关西门子的程序传输问题&#xff0c;大家一般是通过文件共享、ftp、网络驱动器等方式&#xff0c;其中828D还需要授权开通网络启动器 下面介绍一种方式直接进入西门子Linux底层系统实现和NCK的文件交互功能 软件截图如下 功能表如下 机床程序上载至电脑 电脑程序下传…