news 2026/4/18 4:22:33

【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/4/16 14:44:56

Servlet 环境设置

Servlet 环境设置 引言 Servlet 是 Java 企业版(Java EE)技术中用于扩展 Web 服务器功能的关键组件。在开发基于 Java 的 Web 应用程序时,正确配置 Servlet 环境是至关重要的。本文将详细介绍 Servlet 环境的设置过程,包括所需的软件、配置步骤以及注意事项。 环境准备 …

作者头像 李华
网站建设 2026/4/16 14:15:47

MySQL 安装指南

MySQL 安装指南 引言 MySQL是一款开源的关系型数据库管理系统,广泛用于各种应用场景,包括个人项目、企业级应用等。本文将详细阐述MySQL的安装过程,包括准备工作、安装步骤和常见问题解决,帮助您快速搭建自己的MySQL环境。 准备工作 在开始安装MySQL之前,请确保您的计…

作者头像 李华
网站建设 2026/4/16 18:36:22

破解低温加热难题|这款纹波加热电源,重新定义高效节能新标杆

极端寒流频发、低温环境常态化,诸多行业被“低温加热”难题困住脚步——动力电池低温性能衰减、科研实验温度难以精准控制、工业设备低温启动困难……传统加热方式要么能耗过高、要么效率低下,要么需要额外搭载复杂硬件,始终无法实现“高效、…

作者头像 李华
网站建设 2026/3/14 8:46:18

小程序毕设项目推荐-基于springboot+安卓的智慧医疗电子病历、在线问诊、健康监测、就医服务与健康科普系统设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/11 23:22:49

探索大数据领域数据产品的创新之路

大数据产品创新实战指南:从洞察到落地的7步方法论 标题选项 《大数据产品创新不是玄学:聊聊我踩过的坑与找对的路》《破局大数据产品同质化:如何用用户思维打造“能解决问题”的产品?》《从0到1打造创新数据产品:大数…

作者头像 李华