Spring中单例模式下Bean的生命周期

目录

前言

Bean的实例化流程

Bean信息定义对象-Definition​

BeanDefinition存储到一个名为beanDefinitionMap的集合中​

解析出来的Bean实例对象存储在一个名为singletonObjects的Map集合中​

Bean的生命周期

1.Bean的实例化阶段

2.Bean的初始化阶段

3.Bean的完成阶段

4.Bean的使用和销毁


前言


        在Spring中,我们将对象交给框架来管理,由IOC容器来负责对象的创建与管理。Spring中Bean的生命周期是指从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整的对象,最终存储到单例池中,随后到使用、销毁,这个过程被称为Bean的生命周期。Bean的生命周期大体分为以下几个阶段:

  • Bean的实例化阶段
  • Bean的初始化阶段
  • Bean的完成阶段
  • Bean的使用、销毁

Bean的实例化流程


  • Spring容器在初始化时,会读取解析xml,或者注解的配置信息并将其封装成一个个BeanDefinition对象
  • 将所有的BeanDefinition对象存储到一个名为beanDefinitionMap的Map集合当中
  • Spring容器底层对该Map集合进行遍历,使用反射创建Bean的实例对象
  • 创建好的Bean再存储到名为singletonObjects的Map集合中
  • 当我们调用getBean()方法时,则从该Map集合中取出Bean的实例对象并返回
  1. Bean信息定义对象-Definition

  2. BeanDefinition存储到一个名为beanDefinitionMap的集合中

  3. 解析出来的Bean实例对象存储在一个名为singletonObjects的Map集合中

Bean的生命周期


1.Bean的实例化阶段

        Spring框架会取出BeanDefinition的信息进行判断当前Bean范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化 。

2.Bean的初始化阶段

        Bean创建之后还仅仅是个“半成品”,还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具有技术含量和复杂度的阶段。

        a.Bean实例的属性填充

BeanDefinition中有对当前Bean实体的注入信息通过属性propertyValues存储 ,如图:

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

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去 ;
  • 注入单向对象引用属性时,从容器中getBean获取后通过set 方法反射设置进去,如果容器中没有,则先创建被注入对象Bean的实例(完成整个生命周期)后,再进行注入操作 ;
  • 注入双向对象引用属性,比较复杂,可能出现循环引用(循环依赖),Spring使用三级缓存来解决此问题

        b.Aware接口属性注入

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

        Aware接口发挥处理器的作用,为Bean生命周期各个阶段提供扩展 ,Aware有以下子接口:

Aware接口的回调方法及作用
Aware接口回调方法作用
ServletContextAwaresetServletContext(ServletContext context)Spring框架回调方法注入ServletContext对象,web环境下才生效
BeanFactoryAwaresetBeanFactory(Beanfactory factory)Spring回调方法注入beanFactory对象
BeanNameAwaresetBeanName(String beanName)Spring框架回调方法注入当前Bean在容器中的beanName
ApplicationContextAwaresetApplicationContext(ApplicationContext applicationContext)Spring框架回调方法注入applicationContext对象

        c.BeanPostProcessor的before方法回调:调用后工厂处理器的before()方法

        d.InitializingBean接口的初始化方法回调 :调用系统接口的初始化方法

        e.自定义初始化方法init回调 :调用自定义的初始化方法

        f.BeanPostProcessor的after()方法回调 :调用后工厂处理器的after()方法

3.Bean的完成阶段

        经过初始化阶段,Bean就成为了一个完整的SpringBean,被存储到单例池singletonObjects中去。

4.Bean的使用和销毁

        调用getBean方法取出实例好的Bean来使用,到最后销毁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值