news 2026/9/3 3:07:01

【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/9/2 23:07:11

利用大数据打造个性化用户画像

利用大数据打造个性化用户画像:从0到1读懂你的用户 引言:你真的“懂”你的用户吗? 清晨打开电商APP,首页推的是你上周浏览过的户外帐篷;中午刷视频平台,推荐列表全是你喜欢的悬疑剧解说;晚上收到…

作者头像 李华
网站建设 2026/9/2 23:12:09

【课程设计/毕业设计】基于微信小程序的民艺探索传承之旅系统艺术资源基于Vue+Node.js的民艺探索传承之旅微信小程序设计【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/9/2 21:35:27

小程序毕设选题推荐:基于Vue+Node.js的民艺探索传承之旅小程序设计基于微信小程序的民艺探索传承之旅系统艺术资源【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/9/2 21:28:31

小程序计算机毕设之基于springboot的养老院预约系统的设计与实现基于微信小程序+SpringBoot养老院预约系统(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华