当前位置: 首页 > news >正文

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.lryc.cn/news/350006.html

相关文章:

  • 探索STLport:C++标准模板库的开源实现
  • 计算机Java项目|Springboot高校心理教育辅导设计与实现
  • 数据结构简单介绍、算法简单介绍、算法复杂度、时间复杂度等的介绍
  • Google I/O 2024:有关AI的一切已公布|TodayAI
  • 【Shell脚本】Shell编程之数组
  • Python 全栈系列246 任务调度对象WFlaskAPS
  • 关于Windows中的NTUSER.DAT文件的知识,看这篇文章就差不多了
  • 【Linux】动态库与静态库的底层比较
  • 私活更好用:SpringBoot开源项目!!【送源码】
  • SprintBoot案例-增删改查
  • 【机器学习】:基于决策树与随机森林对数据分类
  • .NET 4.8和.NET 8.0的区别和联系、以及查看本地计算机的.NET版本
  • 23.HashMap的put方法流程
  • 元类结合__new__
  • (C语言)队列实现与用队列实现栈
  • 字符画生成网站 ascii字符画
  • 【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类
  • 探索Playwright:Python下的Web自动化测试革命
  • 先有JVM还是先有垃圾回收器?很多人弄混淆了
  • 关于 vs2019 c++20 规范里的一个全局函数 _Test_callable
  • 07-Fortran基础--Fortran指针(Pointer)的使用
  • 日期差值,
  • GMV ES6直流变频多联空调机组室外机工作原理
  • 中国开源 AI 大模型之光-InternLM2
  • 【嵌入式开发】Arduino人机界面及接口技术:独立按键接口,矩阵按键接口,模拟量按键接口(基础知识介绍)
  • element ui Tree树形控件
  • AI 绘画神器 Fooocus 图生图:图像放大或变化、图像提示、图像重绘或扩充、反推提示词、生成参数提取、所需模型下载
  • yolov8 模型架构轻量化 | 极致降参数量
  • uniapp 小程序低功耗蓝牙配网 ble配网 物联网
  • 服务器防火墙有什么用防护策略