Spring之bean的细节(创建方式、作用范围、生命周期)

在Spring框架中,Bean是一个非常重要的概念,它代表了应用程序中需要被管理的对象。关于Bean的细节,我们可以从创建方式、作用范围以及生命周期三个方面进行阐述。

创建方式

Spring支持以下三种方式创建Bean:

  1. 调用构造器创建Bean:这是最常用的方式。Spring容器通过new关键字调用构造器来创建Bean实例,并通过class属性指定Bean实例的实现类。在这种情况下,<bean/>元素必须指定class属性。
  2. 调用静态工厂方法创建Bean:通过调用静态方法来获取Bean的实例。这种方式需要在配置文件中指定静态工厂方法的全类名和方法名。
  3. 调用实例工厂方法创建Bean:这种方式与静态工厂方法类似,但它是通过调用非静态方法来获取Bean的实例。首先,Spring会实例化工厂Bean,然后调用该Bean的实例方法来获取目标Bean。

另外,Spring还支持使用注解(如@Component@Service@Repository等)来自动扫描和创建Bean。同时,还可以使用@Bean注解在配置类的方法上,表明该方法的返回值是一个Bean,Spring会自动调用该方法来创建Bean。

作用范围

Spring中Bean的作用范围定义了Bean的生命周期和可见性。以下是几种常见的作用范围:

  1. Singleton(单例):这是Spring中的默认范围。一个Bean实例在整个Spring容器中只会被创建一次,并且该实例会被存储到单例缓存中供所有线程访问。
  2. Prototype(原型):每次请求都会创建一个新的Bean实例。
  3. Request(请求):Bean实例的作用范围是在一次HTTP请求期间。这意味着每次HTTP请求都会有一个新的Bean实例,并且这些实例只在该请求的生命周期内有效。
  4. Session(会话):Bean实例的作用范围是在整个用户会话期间。这意味着每个用户会话都会有一个新的Bean实例。
  5. Global Session(全局会话):通常只适用于Portlet Web应用程序。全局会话范围类似于会话范围,但它是跨多个portlet的。
  6. WebSocket(Web套接字):Bean实例的作用范围是在WebSocket连接期间,仅适用于WebSocket应用程序。

生命周期

Spring Bean的生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean结束。这包括一系列的关键点,如Bean的实例化、初始化、依赖注入、使用以及销毁等。

  • 实例化:Spring容器通过反射来实例化Bean。
  • 依赖注入:Spring容器将Bean的依赖项(如其他Bean、资源等)注入到Bean中。
  • 初始化:在Bean实例化并注入依赖项后,Spring容器会调用Bean的初始化方法(如实现了InitializingBean接口的Bean的afterPropertiesSet方法,或者在配置文件中使用init-method属性指定的方法)。
  • 使用:Bean现在可以被应用程序使用了。
  • 销毁:当Spring容器关闭时,它会销毁所有的Bean。在销毁之前,Spring容器会调用Bean的销毁方法(如实现了DisposableBean接口的Bean的destroy方法,或者在配置文件中使用destroy-method属性指定的方法)。

以上就是Spring中Bean的创建方式、作用范围以及生命周期的详细解释。

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

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

相关文章

Chatgpt教你使用Python开发iPhone风格计算器

上次使用Chatgpt写爬虫&#xff0c;虽然写出来的代码很多需要修改后才能运行&#xff0c;但Chatgpt提供的思路和框架都是没问题。 这次让Chatgpt写一写GUI程序&#xff0c;也就是你常看到的桌面图形程序。 由于第一次测试&#xff0c;就来个简单点的&#xff0c;用Python写用…

GPU Burn测试指导

工具下载链接&#xff1a; https://codeload.github.com/wilicc/gpu-burn/zip/master测试方法&#xff1a; 上传工具到操作系统下&#xff0c;解压缩工具&#xff0c;使用make命令完成编译&#xff08;确保cuda环境变量已经配置成功、 nvcc -v能显示结果&#xff09;。 如果安…

文献速递:多模态深度学习在医疗中的应用--多模式婴儿脑分割技术:模糊引导深度学习

Title 题目 Multimodal Infant Brain Segmentation by Fuzzy-informed Deep Learning 多模式婴儿脑分割技术&#xff1a;模糊引导深度学习 01 文献速递介绍 日益普及的非侵入式婴儿脑磁共振图像&#xff08;MRI&#xff09;为准确理解脑主要发展轨迹的动态性提供了机会&…

树莓派|串口通信协议

1、串口通信原理 串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种通讯方式。串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的协议。串…

Flutter 中的 SwitchListTile 小部件:全面指南

Flutter 中的 SwitchListTile 小部件&#xff1a;全面指南 在Flutter的Material组件库中&#xff0c;SwitchListTile是一个包含开关&#xff08;Switch&#xff09;的列表项&#xff0c;非常适合用来创建带有标题、副标题以及开关的列表项&#xff0c;常用于设置界面&#xff…

图的遍历最小生成树问题

遍历和最小生成树是图论中常见的问题。下面我将分别介绍如何在 Java 中实现图的遍历和最小生成树算法&#xff0c;包括深度优先搜索&#xff08;DFS&#xff09;、广度优先搜索&#xff08;BFS&#xff09;以及最小生成树算法之一的Prim算法。 1. 图的遍历 a. 深度优先搜索&a…

“ModuleNotFoundError: No module named ‘selenium‘”报错如何解决

接上节&#xff1a;测试平台开发之测试框架改造并发执行及结果隔离(1) 上节博客的末尾提到&#xff1a;在命令窗口执行python main.py 可是执行的时候遇到了如下报错&#xff1a; ERRORS _____________________________________________________________ ERROR collecting te…

如何安全高效地进行4S店文件分发,保护核心资产?

4S店与总部之间的文件分发是确保双方沟通顺畅、信息共享和决策支持的重要环节。4S店文件分发涉及到以下文件类型&#xff1a; 销售报告&#xff1a;4S店需要定期向总部提交销售报告&#xff0c;包括销售数量、销售额、市场份额等关键指标。 库存管理文件&#xff1a;包括车辆库…

使用docker创建hadoop集群:Couldn‘t upload the file

运行的环境; Windows10 Docker Desktopdocker-hadoop 出现的问题如下: 解决方法 https://github.com/big-data-europe/docker-hadoop/issues/98

Unity Pixels Per Unit 与 Sprite Renderer Scale的逻辑关系,为什么平铺的Sprite Renderer会变形?

SpriteRenderer之前用的比较基础&#xff0c;没遇到过什么问题&#xff0c;这几天使用SpriteRenderer的平铺时发现平铺变形了&#xff0c;研究了一下&#xff0c;原来有这么多在逻辑在里面。 当我们导入图片选择Texture Type为Sprite时表示我们的图片用途是UI或者SpriteRendere…

【go项目01_学习记录12】

代码组织 1 代码结构2 重构与测试2.1 安装测试功能2.2 testify 的常用断言函数 3 表组测试 1 代码结构 所有的代码写在一个main.go文件里面&#xff0c;GO编译器也是可以正常执行的。但是当代码量很庞大时&#xff0c;很难进行维护。 Go Web 程序的代码组织 单文件——反模式…

C语言笔记15

指针2 1.数组名的理解 int arr[ 10 ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; int *p &arr[ 0 ];17391692786 arr是数组名&#xff0c;数组名是首元素地址&#xff0c;&arr[0]就是取出首元素的地址放在指针变量p中。 #include <stdio.h> int main()…

基于GWO灰狼优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 GRU网络 4.3 注意力机制&#xff08;Attention&#xff09; 4.4 GWO优化 5.算法完整程序工程 1.算法运行效果图预览…

C++初探_友元类

1.友元类 代码&#xff1a; #include <iostream> class Tv { public:friend class Remote;... };class Remote {... }; 2.友元成员函数 即&#xff1a;不需要整个类成为友元&#xff0c;只需要选择让特定的类成员成为另一个类的友元&#xff1a; &#xff08;1&…

logback 日志脱敏

工具类 CustomLogbackPatternLayoutEncoder.java import ch.qos.logback.classic.encoder.PatternLayoutEncoder;public class CustomLogbackPatternLayoutEncoder extends PatternLayoutEncoder {/*** 正则替换规则*/private LogbackReplaces replaces;/*** 使用自定义 MyLog…

图的拓扑序列(DFS1)

way&#xff1a;在图里面能延伸的越远&#xff0c;deep越大&#xff0c;说明它能从自己延伸很长到别的节点&#xff08;别的节点一定有入度&#xff09;&#xff0c;它越可能没有入度。 #include<iostream> #include<vector> #include<map> #include<set…

ChatGlm的部署和训练

一、chatGlm的环境部署 1.安装anocoda 下载安装anaconda。具体教程详见官网教程。 2.安装CUDA 1&#xff09;首先在终端查看你的Nividian版本&#xff0c;命令如下&#xff1a; 2)如果你没有下载你要去下载cuda下载网站&#xff0c;这里是12.3是因为我cuda version版本12…

【微记录】linux如何使用ebpf观测你的某个命令调用了内核的ioctl?(bpftrace sys_enter_ioctl)

场景 对于工程实践中需要查看某些ioctl是否被调用&#xff0c;尤其是一个新的模块初次调试&#xff0c;在不添加调试命令debug的情况下如何观测&#xff1f; 另外就是对于外部提供的二进制程序&#xff0c;如何观测该程序是否调用ioctl以及何时调用&#xff1f; 这些都通过ebp…

【保姆级】生成式网络模型基础知识(图像合成/语音合成/GPT)

生成式模型基础知识 初步接触生成任务 生成任务&#xff0c;顾名思义就是要去生成一个东西&#xff0c;比如生成图片/音频/文字等等。 大家接触最多比如chatGPT、stable diffusion、还有一些语音合成相关的东西。 那么问题来了&#xff0c;具体生成步骤是什么样的&#xff…

JVM 常见知识点总结

文章目录 一、类加载篇1.1 类加载过程1.2 类加载器分类1.3 双亲委派机制 二、JVM内存结构篇2.1 JVM内存结构2.2 对象的创建过程2.3 强软弱虚引用 三、垃圾回收篇3.1 如何判断对象是否死亡3.2 哪些对象可以作为gcroots3.3 垃圾回收算法3.4 Minor GC和Full GC的区别3.5 HotSpot为…