news 2026/6/10 4:28:40

【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/6/6 17:14:55

大数据领域数据工程的版本控制策略

大数据领域数据工程的版本控制策略 关键词:大数据、数据工程、版本控制、策略、数据管理 摘要:本文聚焦于大数据领域数据工程的版本控制策略。在大数据环境下,数据的规模、复杂性和动态性给数据工程带来了诸多挑战,版本控制成为确保数据质量、可追溯性和协作效率的关键。文…

作者头像 李华
网站建设 2026/6/6 16:41:55

小程序计算机毕设之基于Vue+Node.js的民艺探索传承之旅微信小程序设计(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/6/9 22:49:31

CANN图编译与执行优化:从计算图到硬件指令的极致转化实战

CANN组织链接:https://atomgit.com/cann ops-nn仓库链接:https://atomgit.com/cann/ops-nn 当计算图优化不足导致推理延迟波动37%,当硬件指令生成低效浪费42%算力——图编译已成为AI性能的“隐形瓶颈”。传统框架深陷图优化碎片化、硬件适配…

作者头像 李华
网站建设 2026/6/9 18:38:00

小程序毕设项目:基于springboot的养老院预约系统的设计与实现小程序设计(源码+文档,讲解、调试运行,定制等)

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

作者头像 李华