对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。Spring中每个Bean的生命周期如下:

1. 实例化Bean

对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。

对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean。

容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。

实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

2. 设置对象属性(依赖注入)

实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。

紧接着,Spring根据BeanDefinition中的信息进行依赖注入。

并且通过BeanWrapper提供的设置属性的接口完成依赖注入。

3. 注入Aware接口

紧接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean。

4. BeanPostProcessor

当经过上述几个步骤后,bean对象已经被正确构造,但如果你想要对象被使用前再进行一些自定义的处理,就可以通过BeanPostProcessor接口实现。

该接口提供了两个函数:

  • postProcessBeforeInitialzation( Object bean, String beanName )当前正在初始化的bean对象会被传递进来,我们就可以对这个bean作任何处理。这个函数会先于InitialzationBean执行,因此称为前置处理。所有Aware接口的注入就是在这一步完成的。
  • postProcessAfterInitialzation( Object bean, String beanName )当前正在初始化的bean对象会被传递进来,我们就可以对这个bean作任何处理。这个函数会在InitialzationBean完成后执行,因此称为后置处理。

5. InitializingBean与init-method

当BeanPostProcessor的前置处理完成后就会进入本阶段。

InitializingBean接口只有一个函数:

  • afterPropertiesSet()

这一阶段也可以在bean正式构造完成前增加我们自定义的逻辑,但它与前置处理不同,由于该函数并不会把当前bean对象传进来,因此在这一步没办法处理对象本身,只能增加一些额外的逻辑。若要使用它,我们需要让bean实现该接口,并把要增加的逻辑写在该函数中。然后Spring会在前置处理完成后检测当前bean是否实现了该接口,并执行afterPropertiesSet函数。

当然,Spring为了降低对客户代码的侵入性,给bean的配置提供了init-method属性,该属性指定了在这一阶段需要执行的函数名。Spring便会在初始化阶段执行我们设置的函数。init-method本质上仍然使用了InitializingBean接口。

6. DisposableBean和destroy-method

和init-method一样,通过给destroy-method指定函数,就可以在bean销毁前执行指定的逻辑。

上面是Spring 中Bean的核心接口和生命周期,面试回答上述过程已经足够了。但是翻阅JavaDoc文档发现除了以上接口外,还有另外的初始化过程涉及的接口:摘自org.springframework.beans.factory.BeanFactory, 全部相关接口如下,上述已有的就不用着重标注,把额外的相关接口着重标注下

Spring中Bean的生命周期是怎样的?相关推荐

  1. Spring 中 Bean 的生命周期

    本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...

  2. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  3. 面试问题:Spring中Bean 的生命周期

    Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...

  4. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  5. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  6. Spring中Bean的生命周期是怎样的

    于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: ...

  7. Spring中Bean的生命周期以及三级缓存介绍

    Bean的生命周期以及三级缓存介绍 简述 测试代码编写 创建IOC容器(Bean创建) 1.refresh()方法 2.finishBeanFactoryInitialization(beanFact ...

  8. Spring中Bean的生命周期以及IOC与AOP加载过程

    首先说一下Bean的生命周期 Bean的生命周期 创建Bean >> 初始化 >> 摧毁 1.创建Bean 当设置Bean为单例时,在spring容器启动时会创建Bean. 当 ...

  9. Spring官网阅读(九)Spring中Bean的生命周期(上)

    文章目录 生命周期回调 1.Bean初始化回调 2.Bean销毁回调 3.配置默认的初始化及销毁方法 4.执行顺序 5.容器启动或停止回调 Lifecycle 接口 LifecycleProcesso ...

最新文章

  1. linux 版本 arch,Arch Linux是什么
  2. 深入理解Java:注解(Annotation)自定义注解入门
  3. Linux查看内存使用情况
  4. php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...
  5. python哨兵循环_Python中的Sentinel(哨兵)值
  6. 实现带header和footer功能的RecyclerView
  7. 阶乘的精确值 大数问题
  8. 点云3D目标检测学习(3):Complex YOLO
  9. mysql的join语句使用_MySQL开发技巧——如何正确使用Join语句
  10. 【ubuntu】安装qemu
  11. 王道计算机考研数据结构—学习笔记Chapter Five 串String
  12. 制作u盘winpe启动盘_U教授工具如何制作U盘启动盘
  13. 制作 macOS Mojave U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  14. Lnmp部署tp5项目报错:require(): open_basedir restriction in effect. File(/home/wwwroot/api.321.design/think
  15. 2020最难求职年,程序员职场面试 “防坑指南” ,全员必备!
  16. nao机器人学习笔记1
  17. 消息称:华为将官宣为全国老款手机内存扩容
  18. spring源码解析,vip视频解析源码
  19. CentOS 部署 NodeBB
  20. USACO 2.1.3 Ordered Fractions

热门文章

  1. javascript(js)获取访客通过搜索引擎进入页面的搜索关键词的简洁有效代码
  2. 检测客户pc电脑端VC++环境并安装
  3. 【JQuery】使用JQuery 合并两个 json 对象
  4. 贝叶斯公式的个人理解
  5. 使用RSS订阅喜欢的微博博主
  6. 从上往下打印出二叉树的每个节点,同层节点从左至右打印
  7. COM+在win2003+IIS+MSSQL环境下的部署步骤
  8. win10 mysql8.0.12 忘记root密码如何重置密码
  9. sort()排序(Comparable、Comparator)
  10. 【20180202】使用iptables做MySQL的端口转发