Spring Bean的生命周期

本文详细阐述了SpringBean从实例化到销毁的生命周期过程,包括实例化流程、属性注入策略(普通属性、单向与双向对象)、Aware接口的作用以及初始化和销毁机制,展示了Spring框架的核心原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、梗概


        Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。

Spring Bean的生命周期大体上分为三个阶段:

  • Bean的实例化阶段:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是 singleton的, 是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的 Bean通过反射进行实例化;
  • Bean的初始化阶段:Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执 行一些Aware 接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方 法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段;
  • Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池 singletonObjects中去了,即完成了Spring Bean的整个生命周期。

二、实例化


Bean 实例化的基本流程  

  • 加载xml配置文件,解析获取配置中的每个的信息,封装成一个个的BeanDefinition对象;
  • 将BeanDefinition存储在一个名为beanDefinitionMap的Map中;
  • ApplicationContext底层遍历beanDefinitionMap,创建Bean实例对象;
  • 创建好的Bean实例对象,被存储到一个名为singletonObjects的Map中;
  • 当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例返回

三、属性注入


Spring在进行属性注入时,会分为如下几种情况:

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
  • 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没 有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
  • 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖) 

四、Aware


        Aware接口是一种框架辅助属性注入的一种思想,其他框架中也可以看到类似的接口。框架具备高度封 装性,我们接 触到的一般都是业务代码,一个底层功能API不能轻易的获取到,但是这不意味着永远用 不到这些对象,如果用到了 ,就可以使用框架提供的类似Aware的接口,让框架给我们注入该对象

五、初始化 


       由于Bean的初始化阶段的步骤比较复杂,所以着重研究Bean的初始化阶段 Spring Bean的初始化过程涉及如下几个过程:

  • Bean实例的属性填充
  • Aware接口属性注入
  • BeanPostProcessor的before()方法回调
  • InitializingBean接口的初始化方法回调
  • 自定义初始化方法init回调
  • BeanPostProcessor的after()方法回调

六、销毁


6.1 指定初始化销毁方法


在被声明的Bean里面自己定义初始化和销毁的方法,然后通过@Bean注解的属性,制定初始化和销毁的方法;

初始化方法调用时机:在bean创建完成,然后赋值做好了以后,就会调用init方法;【具体调用流程,详见springBean创建过程】

销毁:spring容器被关闭的时候;

6.2 实现接口InitializingBean  DisposableBean 

InitializingBean 初始化接口,里面有方法afterPropertiesSet

DisposableBean 销毁接口,里面有方法destroy

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值