news 2026/6/1 19:16:19

【Spring 原理】Bean 的作用域与生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring 原理】Bean 的作用域与生命周期

文章目录

    • 一、Bean的作用域
      • 1.1 概念
      • 1.2 Bean的作用域
    • 二、Bean的生命周期
      • 2.1 概念
      • 2.1 代码演示

一、Bean的作用域

1.1 概念

在Spring IoC&DI,Spring 是通过以下方式管理对象的。

  1. 通过@Controller , @Service , @Repository , @Component , @Configuration , @Bean 来声明Bean对象。
  2. 通过 ApplicationContext 或者 BeanFactory 来获取对象
  3. 通过@Autowired , Setter 方法或者构造方法等来为应用程序注入所依赖的Bean对象。

  1. 通过@Bean 声明bean , 把bean存在Spring容器中
@ComponentpublicclassDogBeanConfig{@BeanpublicDogdog(){Dogdog=newDog();dog.setName("旺旺");returndog;}}
  1. 从Spring容器中获取Bean
@SpringBootApplicationpublicclassSpringIocApplication{publicstaticvoidmain(String[]args){//获取Spring上下文对象ApplicationContextcontext=SpringApplication.run(SpringIocApplication.class,args);//从Spring上下文中获取对象Dogdog=context.getBean(Dog.class);System.out.println(dog);}}

也可以通过在代码中直接注入ApplicationContext的方式来获取Spring容器

@SpringBootTestclassDemoApplicationTests{@AutowiredprivateApplicationContextapplicationContext;//Spring 容器@TestvoidcontextLoads(){DogBeandog1=applicationContext.getBean(DogBean.class);System.out.println(dog1);}}

观察运行结果:
发现输出的bean对象地址值是一样的,说明每次从Spring容器中取出来的对象都是同一个。这也是"单例模式"

单例模式:确保一个类只有一个实例,多次创建也不会创建出多个实例。

默认情况下,Spring容器中的bean都是单例的,这种行为模式,我们就称之为Bean的作用域。
Bean 的作用域是指 Bean 在 Spring 框架中的某种行为模式。

1.2 Bean的作用域

在Spring中支持6种作用域,后4种在Spring MVC环境才生效

  1. singleton:单例作用域
  2. prototype:原型作用域(多例作用域)
  3. request:请求作用域
  4. session:会话作用域
  5. Application: 全局作用域
  6. websocket:HTTP WebSocket 作用域
作用域说明
singleton每个Spring IoC容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(非单例)
request每个HTTP 请求生命周期内, 创建新的实例(web环境中, 了解)
session每个HTTP Session生命周期内, 创建新的实例(web环境中, 了解)
application每个ServletContext生命周期内, 创建新的实例(web环境中, 了解)
websocket每个WebSocket生命周期内, 创建新的实例(web环境中, 了解)

二、Bean的生命周期

2.1 概念

生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。 Bean 的生命周期分为以下5个部分:

  1. 实例化(为Bean分配内存空间)
  2. 属性赋值(Bean注入和装配,比如@AutoWired )
  3. 初始化
    a. 执行各种通知,如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法。
    b. 执行初始化方法
    ▪ xml定义init-method
    ▪ 使用注解的方式 @PostConstruct
    ▪ 执行初始化后置方法( BeanPostProcessor )
  4. 使用Bean
  5. 销毁Bean
    a. 销毁容器的各种方法,如 @PreDestroy , DisposableBean 接口方法,destroymethod。

实例化和属性赋值对应构造方法和setter方法的注入。 初始化和销毁是用户能自定义扩展的两个阶段,可以在实例化之后,类加载完成之前进行自定义"事件"处理。

执行流程如下图所示:

2.1 代码演示

@ComponentpublicclassBeanLifeComponentimplementsBeanNameAware{privateUserComponentuserComponent;publicBeanLifeComponent(){System.out.println("执行构造函数");}@AutowiredpublicvoidsetUserComponent(UserComponentuserComponent){System.out.println("设置属性userComponent");this.userComponent=userComponent;}@OverridepublicvoidsetBeanName(Strings){System.out.println("执行了 setBeanName 方法:"+s);}@PostConstructpublicvoidpostConstruct(){System.out.println("执行 PostConstruct()");}publicvoiduse(){System.out.println("执行了use方法");}@PreDestroypublicvoidpreDestroy(){System.out.println("执行:preDestroy()");}}

通过运行结果观察

  1. 先执行构造函数
  2. 设置属性
  3. Bean初始化
  4. 使用Bean
  5. 销毁Bean
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 5:14:00

Matplotlib 绘图线

Matplotlib 绘图线 引言 Matplotlib 是一个功能强大的 Python 库,用于创建高质量的 2D 和 3D 图形。在数据分析、数据可视化等领域,Matplotlib 凭借其灵活性和易用性,成为了数据科学家和工程师的必备工具。本文将详细介绍 Matplotlib 中绘制线图的方法,包括基本概念、常用…

作者头像 李华
网站建设 2026/6/1 7:26:43

双喷嘴挡板电液伺服阀故障诊断方法研究

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。1)伺服阀数学建模与典型故障机理分析双喷嘴挡板电液伺服阀的工作过程涵盖…

作者头像 李华
网站建设 2026/5/30 12:28:40

Shell test 命令详解

Shell test 命令详解 引言 Shell 是一种常用的命令行解释器,用于执行操作系统中的命令。在 Shell 编程中,test 命令是一个非常基础的命令,它主要用于条件测试。本文将详细介绍 test 命令的用法、参数、返回值以及与其他命令的结合使用。 一、test 命令的基本用法 test 命…

作者头像 李华
网站建设 2026/5/31 2:12:06

GPU 是怎么从 VBO 读顶点数据、按 VAO 的“说明书”把它拼成顶点着色器能吃的“结构化输入”的?——用大白话讲清楚这一口“顶点数据”到底怎么喂进去

你学 OpenGL 或 OpenGL ES 的时候,最容易被一堆缩写绕晕:VBO、VAO、VertexAttribPointer、layout(location=0)… 然后你照着教程抄完,屏幕上出个三角形,你心里只有一句: “我好像成功了,但我完全不知道为啥。” 尤其是这一步最魔幻: 你明明只是把一串 float 塞进了 VBO,…

作者头像 李华
网站建设 2026/5/28 15:18:49

【计算机毕业设计案例】基于springboot的养老院预约系统基于微信小程序的养老院系统的设计与实现(程序+文档+讲解+定制)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华