【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 数据集(鸢尾花数据集)…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
