【Spring】Bean的作用域和Spring的执行流程
目录
1.Bean的作用域
1.1 Singleton(单例)
1.2 Prototype(原型)
1.3 适用于SpringMVC的作用域
2.Spring的执行流程
2.1 Spring容器的初始化
2.2 Bean的创建和装配
2.3 Bean的生命周期管理
2.4 其他重要概念
3. Spring的执行流程简洁版
1.Bean的作用域
Spring Bean的作用域定义了Bean的生命周期和可见性。Spring 支持多种作用域,以下为各个作用域的讲解。
1.1 Singleton(单例)
Singleton,是一个默认模式也是一种单例模式。
- 在整个Spring IoC容器中,Spring只会创建该Bean的一个实例。
- 所有的请求和对象都共享这个单例Bean
创建一个 SpecializedCourse 类,以该类来演示存储 Bean 和使用 Bean 的流程。
@Component
public class SpecializedCourse {private int id;private String name;private String content;@Overridepublic String toString() {return "SpecializedCourse{" +"id=" + id +", name='" + name + '\'' +", content='" + content + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}
在公共类中设置 SpecializedCourses 的原始数据为 id=1,name=Java,content=数据类型。
@Component
public class SpecializedCourses {@Bean("specializedCourse")public SpecializedCourse getSpecializedCourse() {//原始信息SpecializedCourse specializedCourse = new SpecializedCourse();specializedCourse.setId(1);specializedCourse.setName("Java");specializedCourse.setContent("数据类型");return specializedCourse;}
}
CourseService 类使用 SpecializedCourse 类中原始信息并修改为 id=2,name=C++,content=数据结构。
@Service
public class CourseService {@Autowiredprivate SpecializedCourse specializedCourse;public void getSpecializedCourse() {//原来的内容System.out.println(specializedCourse.toString());specializedCourse.setId(2);specializedCourse.setName("C++");specializedCourse.setContent("数据结构");//修改后的内容System.out.println(specializedCourse.toString());;}
}
CourseService2 类使用 SpecializedCourse 类中原始信息发现获取得是 CourseService 修改后的内容。
@Service
public class CourseService2 {@Autowiredprivate SpecializedCourse specializedCourse;// 想要获取到原来的内容,发现已经被修改了public void getSpecializedCourse() {System.out.println(specializedCourse.toString());;}
}
在 App 启动类中,对比 CourseService 和 CourseService2 使用 SpecializedCourse 后的结果。
public class App {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("Spring-config.xml");// CourseServiceCourseService courseService =context.getBean("courseService",CourseService.class);courseService.getSpecializedCourse();//CourseService2CourseService2 courseService2 =context.getBean("courseService2",CourseService2.class);courseService2.getSpecializedCourse();}
}
运行结果:
1.2 Prototype(原型)
Prototype 英译为原型,在 Spring 框架中,当一个 Bean 的作用域被设置为“prototype”时,每次对该 Bean 的请求都会导致 Spring 容器创建一个新的 Bean 实例。这与单例(Singleton)作用域不同,后者在整个 Spring IoC 容器中只创建一个 Bean 实例。因此:
- 每次请求都会创建一个新的Bean实例。
- 适用于有状态的Bean。
因此,我们只需要将上述的 SpecializedCourses 原型数据加上 Scope 注解,就能实现原始数据不会被修改问题(实际上就是将该 Bean 对象设置为多例形式)。
@Component
public class SpecializedCourses {@Scope("prototype")@Bean("specializedCourse")public SpecializedCourse getSpecializedCourse() {SpecializedCourse specializedCourse = new SpecializedCourse();specializedCourse.setId(1);specializedCourse.setName("Java");specializedCourse.setContent("数据类型");return specializedCourse;}
}
App 启动类运行结果为:
Scope 注解两种写法:
- @Scope("prototype")
- @Scope("ConfigurableBeanFactory.SCOPE_PROTOTYPE")
1.3 适用于SpringMVC的作用域
适用于 Spring MVC 的作用域有三种:request、session、application。
RequestScope
- 描述:每个HTTP请求都会创建一个新的作用域,该作用域中的对象仅在当前请求的处理期间可见。请求完成后,作用域中的对象会被销毁。
- 适用场景:适用于需要在请求级别上保持状态或处理特定请求的逻辑,如存储请求相关的数据。
SessionScope
- 描述:在用户会话期间保持对象的可见性。当用户登录时创建会话作用域对象,直到用户注销或会话超时才销毁。
- 适用场景:适用于需要在会话级别上保持状态或处理特定会话的逻辑,如存储用户信息或会话状态。
ApplicationScope
- 描述:对象在整个应用程序中都是可见的,且生命周期最长。对象在应用程序启动时创建,直到应用程序关闭才销毁。
- 适用场景:适用于需要在应用程序级别上保持状态或处理全局逻辑的对象,如存储全局配置或共享数据。
2.Spring的执行流程
Spring的执行流程是一个复杂但有序的过程,它主要涉及Spring容器的初始化和Bean的创建、装配及生命周期管理。以下是Spring执行流程的详细解析:
2.1 Spring容器的初始化
读取配置信息:
Spring在启动时首先会读取应用程序提供的Bean配置信息,这些信息通常定义在XML配置文件或注解中。生成Bean配置注册表:
根据读取的配置信息,Spring容器会生成一份相应的Bean配置注册表,该注册表包含了所有需要实例化的Bean及其依赖关系。实例化BeanFactory:
对于ApplicationContext容器,它内部封装了一个BeanFactory对象来实现对容器的操作。BeanFactory是Spring IoC容器的基础,它封装了Bean的信息,并提供了创建和管理Bean的接口。解析配置文件:
使用XmlBeanDefinitionReader等解析器解析配置文件,将Bean定义(BeanDefinition)注册到容器中。
2.2 Bean的创建和装配
实例化Bean:
当客户向容器请求一个尚未初始化的Bean时,或初始化Bean时需要注入另一个尚未初始化的依赖时,容器会调用createBean进行实例化。对于ApplicationContext容器,它会在容器启动结束后实例化所有的Bean。依赖注入:
在Bean实例化后,Spring会根据BeanDefinition中的信息进行依赖注入。这通常通过构造函数注入、Setter方法注入或接口注入等方式实现。Aware接口注入:
Spring会检测Bean是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean。这允许Bean获取到Spring容器的相关资源和服务。BeanPostProcessor前置处理:
在Bean正式构造完成前,Spring会调用实现了BeanPostProcessor接口的类的前置处理方法(postProcessBeforeInitialization),允许对Bean进行额外的处理或修改。初始化Bean:
接下来,Spring会调用Bean的初始化方法。这可以通过实现InitializingBean接口并定义afterPropertiesSet方法来实现,也可以通过在配置文件中指定init-method属性来实现。BeanPostProcessor后置处理:
在Bean初始化完成后,Spring会调用实现了BeanPostProcessor接口的类的后置处理方法(postProcessAfterInitialization),允许对Bean进行进一步的修改或处理。
2.3 Bean的生命周期管理
使用Bean:
经过上述步骤后,Bean已经准备好被应用程序使用。应用程序可以通过调用Bean的方法来执行相应的业务逻辑。销毁Bean:
当容器关闭或Bean不再需要时,Spring会调用Bean的销毁方法。这可以通过实现DisposableBean接口并定义destroy方法来实现,也可以通过在配置文件中指定destroy-method属性来实现。
2.4 其他重要概念
控制反转(IoC):
IoC是Spring的核心思想之一,它通过将组件的控制权从组件本身转移到外部容器来管理和解耦组件之间的依赖关系。依赖注入(DI):
DI是IoC的一种实现方式,它通过在创建组件时将所需的依赖对象注入到组件中来实现组件之间的解耦。面向切面编程(AOP):
AOP是Spring的另一个重要特性,它通过将横切关注点(如日志、事务管理等)从主要业务逻辑中分离出来并模块化地封装为切面,从而在需要的地方将这些横切关注点织入到应用程序中。
综上所述,Spring的执行流程是一个涉及容器初始化、Bean创建和装配以及生命周期管理的复杂过程。通过这个过程,Spring能够高效地管理和维护应用程序中的对象及其依赖关系。
3. Spring的执行流程简洁版
1.定义配置文件
定义 Spring 的.xml 配置文件,通常名为 spring-config.xml 放置在 resource 文件底下。
2.读取配置文件
读取 spring-config.xml 文件,获取 .xml 文件所设置的 Bean 对象地址(包名等等),为下次获取到 Bean 对象做准备。
3.实例化Bean对象
通过 <Bean></Bean> 标签(xml配置文件)、类注解(@Controller、@Service...)、方法注解来实例化 Bean 对象。
4.依赖注入
通过构造方法、Setter方法、@Autowired注解、@Resource注解,来获取 Bean 对象。在此就不举例子,可看本专栏内博文了解。
5.Bean就绪
此时就可以通过一些获取 Spring 的上下文的类从 Spring 容器中拿 Bean 对象(使用Bean对象)了,如 ApplicationContext 类中的 getBean 方法。
6.处理请求(用于SpringMVC)
如果 .xml 文件中有对于外部的请求,如别人想通过网络来获取你的 Bean 对象,此时就会使用到接受请求和处理请求即 RequestScope、SessionScope、ApplicationScope等。
本篇博客到这里就结束,感谢您的阅读!
相关文章:

【Spring】Bean的作用域和Spring的执行流程
目录 1.Bean的作用域 1.1 Singleton(单例) 1.2 Prototype(原型) 1.3 适用于SpringMVC的作用域 2.Spring的执行流程 2.1 Spring容器的初始化 2.2 Bean的创建和装配 2.3 Bean的生命周期管理 2.4 其他重要概念 3. Spring的执行流程简洁版 1.Bean的作用域 Spring Bean的…...

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

QtWebServer
QtWebServer 是创建基于 Qt 的高性能 Web 应用程序服务器的尝试,即。运行本机 C/Qt 代码以交付网站的 Web 服务器。 一个完美的用例是为较小的服务提供 REST API。 在 Qt 应用程序中,您可以设置资源并将其绑定到物理提供程序,例如文件或数据…...
网络基础概念与应用:深入理解计算机网络
引言 计算机网络作为现代信息技术的重要支柱,是连接世界各地的重要纽带。它使得计算机能够相互通信、协同工作,从而极大地提高了我们的工作效率和生活质量。本篇文章将深入探讨计算机网络的基础概念,覆盖网络的分层模型、协议、数据传输原理…...
<el-select> :remote-method用法
el-select :remote-method用法 说明代码实现单选多选 说明 在 Vue.js 中, 是 Element UI 库提供的一个下拉选择框组件。:remote-method 是 组件的一个属性,用于指定一个远程方法,该方法将在用户输入时被调用,以获取下拉列表的选项…...

CKA认证 | Day3 K8s管理应用生命周期(上)
第四章 应用程序生命周期管理(上) 1、在Kubernetes中部署应用流程 1.1 使用Deployment部署Java应用 在 Kubernetes 中,Deployment 是一种控制器,用于管理 Pod 的部署和更新。以下是使用 Deployment 部署 Java 应用的步骤&#x…...

JavaWeb——HTML、CSS
目录 1.概述 2.HTML a.HTML结构标签 b.图片标签 c.标题标签 d.水平线标签 e.布局标签 f.超链接标签 e.视频标签 f.音频标签 e.换行标签 f.段落标签 g.加粗标签 h.表格 1.声明表格 2.表行 3.普通表格 4.加粗表格 i.表单标签 1.声明表单 2. 表单 3.下拉列表…...
springboot如何获取控制层get和Post入参
一、在 Spring 配置中创建一个过滤器,将 HttpServletRequest 包装为 ContentCachingRequestWrapper import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import j…...

30 秒!用通义灵码画 SpaceX 星链发射流程图
不想读前人“骨灰级”代码, 不想当“牛马”程序员, 想像看图片一样快速读复杂代码和架构? 来了,灵码又加新 buff!! 通义灵码支持代码逻辑可视化, 可以把你的每段代码画成流程图。 你可以把…...

设计模式之组合模式(营销差异化人群发券,决策树引擎搭建场景)
前言: 往往很多大需求都是通过增删改查堆出来的,今天要一个需求if一下,明天加个内容else扩展一下。日积月累需求也就越来越大,扩展和维护的成本也就越来越高。往往大部分研发是不具备产品思维和整体业务需求导向的,总以…...
关于做完 C# 项目的问题总结
1. .Any()方法使用 可以与其他LINQ方法结合使用,以构建更复杂的查询。例如,你可以首先过滤集合,然后检查过滤后的集合是否包含任何元素: List<string> fruits new List<string> { "Apple", "Banana&q…...
CSS响应式布局实现1920屏幕1rem等于100px
代码解析与实现 设置根元素的 font-size 为 5.208333vw 假设你想让根元素的 font-size 基于视口宽度来动态调整。我们可以通过设置 font-size 为 5.208333vw 来让 1rem 相当于视口宽度的 5.208333%。 计算 5.208333vw: 当屏幕宽度为 1920px 时,5.208333vw 等于 5…...
根据当前浏览器版本,下载或更新驱动文件为对应的版本
以前通过ChromeDriverManager().install()的方式自动下载驱动的方式,现在行不通了,访问不通下载网址,会报错:requests.exceptions.ConnectionError: Could not reach host. Are you offline? 所以想着换一个下载地址和方式&…...

【轻量化】YOLOv10 更换骨干网络之 MobileNetv4 | 模块化加法!非 timm 包!
之前咱们在这个文章中讲了timm包的加法,不少同学反馈要模块化的加法,那么这篇就讲解下模块化的加法,值得注意的是,这样改加载不了mobilebnetv4官方开源的权重了~ 论文地址:https://arxiv.org/pdf/2404.10518 代码地址:https://github.com/tensorflow/models/blob/master…...

人体存在感应器设置时间开启感应人存在开灯,失效
环境: 领普人体存在感应器 问题描述: 人体存在感应器设置时间开启感应人存在开灯,失效,设置下午5点,如果有人在5点前一直在这个区域,这个时候到了5点,就触发不了感应自动打开灯光。 解决方案:…...
2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控…...
Vuex vs Pinia:新一代Vue状态管理方案对比
引言 随着Vue生态系统的不断发展,状态管理已经成为现代Vue应用程序中不可或缺的一部分。Vuex作为Vue官方的状态管理方案,一直是开发者的首选。然而,随着Pinia的出现,为Vue开发者带来了新的选择。本文将深入对比这两个状态管理方案…...
es查询报错:too_many_buckets_exception
故障排除 es查询报错:too_many_buckets_exception {"error":{"root_cause":[],"type":"search_phase_execution_exception","reason":"","phase":"fetch","grouped":…...

outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务
微软邮箱反垃圾已经很强大了非常敏感,自家的域名的邮件都能给扔到垃圾邮箱里,但还是在本地增加了一层垃圾邮箱功能,然后垃圾邮箱并没有提示,导致错过很多通知,本身并没有提供关闭的功能,但微软有个Microsof…...

机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)
目录 关于1 个体与集成2 Boosting3 Bagging与随机森林4 结合策略5 多样性X 案例代码X.1 分类任务-Adaboost-SVMX.1.1 源码X.1.2 数据集(鸢尾花数据集)X.1.3 模型效果 X.2 分类任务-随机森林RFX.2.1 源码X.2.2 数据集(鸢尾花数据集)…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...