Bean的生命周期

下图是标准的Bean的生命周期

为了更好理解,可以重构成实例化属性注入初始化销毁四个主要部分,其余部分相当于使用AOP技术,如果实现了相关接口,才会有这些过程。

也可以按这下面理解:

从代码看Bean的生命周期

Person :自定义Bean

public class Person implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware {private String name;private String sex;Person(){System.out.println("Person 实例化");}public void setSex(String sex) {System.out.println("Person 注入{sex}属性");this.sex = sex;}public void setName(String name) {System.out.println("Person 注入{name}属性");this.name = name;}public void myInit(){System.out.println("Person 的初始化myInit()方法");}public void myDestory(){System.out.println("Person 的初始化myDestory()方法");}@Overridepublic void setBeanName(String s) {System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("【BeanFactoryAware】调用BeanFactoryAware.setBeanFactory()");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("【ApplicationContextAware】调用ApplicationContextAware.setApplicationContext()");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("【InitializingBean】调用InitializingBean.afterPropertiesSet()");}@Overridepublic void destroy() throws Exception {System.out.println("【DisposableBean】调用DisposableBean.destroy()");}
}

BeanFactoryPostProcessor : 其实BeanFactoryPostProcessor其实不属于Bean的生命周期,而是容器的生命周期。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.println("调用【BeanFactoryPostProcessor】的【postProcessBeanFactory】方法");}
}

BeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("调用【BeanPostProcessor】的【postProcessBeforeInitialization】方法");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("调用【BeanPostProcessor】的【postProcessAfterInitialization】方法");return bean;}
}

InstantiationAwareBeanPostProcessor

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {System.out.println("调用【InstantiationAwareBeanPostProcessor】的【postProcessBeforeInstantiation】方法");return null;}@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {System.out.println("调用【InstantiationAwareBeanPostProcessor】的【postProcessAfterInstantiation】方法");return true;}@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {System.out.println("调用【InstantiationAwareBeanPostProcessor】的【postProcessProperties】方法");return pvs;}
}

application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id="person" class="org.whu.mya.Person" scope="singleton"init-method="myInit" destroy-method="myDestory"><property name="name" value="张三"></property><property name="sex" value="男"></property></bean><bean class="org.whu.mya.MyBeanFactoryPostProcessor"></bean><bean class="org.whu.mya.MyBeanPostProcessor" ></bean><bean class="org.whu.mya.MyInstantiationAwareBeanPostProcessor"></bean>
</beans>

入口程序SpringLifeCycleApplication

public interface SpringLifeCycleApplication {public static void main(String[] args) {System.out.println("现在开始初始化容器!!!");ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");System.out.println("容器初始化成功!!!");System.out.println("现在开始关闭容器!!!");((ClassPathXmlApplicationContext)context).registerShutdownHook();}
}

结果展示:

现在开始初始化容器!!!
调用【BeanFactoryPostProcessor】的【postProcessBeanFactory】方法调用【InstantiationAwareBeanPostProcessor】的【postProcessBeforeInstantiation】方法
Person 实例化
调用【InstantiationAwareBeanPostProcessor】的【postProcessAfterInstantiation】方法
调用【InstantiationAwareBeanPostProcessor】的【postProcessProperties】方法Person 注入{name}属性
Person 注入{sex}属性
【BeanNameAware接口】调用BeanNameAware.setBeanName()
【BeanFactoryAware】调用BeanFactoryAware.setBeanFactory()
【ApplicationContextAware】调用ApplicationContextAware.setApplicationContext()调用【BeanPostProcessor】的【postProcessBeforeInitialization】方法
【InitializingBean】InitializingBean.afterPropertiesSet()
Person 的初始化myInit()方法
调用【BeanPostProcessor】的【postProcessAfterInitialization】方法容器初始化成功!!!现在开始关闭容器!!!
【DisposableBean】调用DisposableBean.destroy()
Person 的初始化myDestory()方法

Bean生命周期中的一些钩子函数

按Bean生命周期的顺序介绍一下各钩子函数的作用

BeanFactoryPostProcessor

public interface BeanFactoryPostProcessor {void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

BeanFactoryPostProcessor接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。

说通俗一些就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性。

InstantiationAwareBeanPostProcessorBeanPostProcessor

InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的子接口,通过接口字面意思翻译该接口的作用是感知Bean实例化(Bean构造方法)的处理器。
InstantiationAwareBeanPostProcessor接口有三个可重写的方法,

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
}public interface BeanPostProcessor {Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

从源码中我们可以获知的信息是该接口除了具有父接口中的两个方法以外还自己额外定义了三个方法。所以该接口一共定义了5个方法,这5个方法的作用分别是:

方法 描述
postProcessBeforeInstantiation InstantiationAwareBeanPostProcessor 自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
postProcessAfterInstantiation InstantiationAwareBeanPostProcessor 自身方法,在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行
postProcessPropertyValues InstantiationAwareBeanPostProcessor 自身方法,对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
postProcessBeforeInitialization BeanPostProcessor接口中的方法,在Bean的自定义初始化方法之前执行
postProcessAfterInitialization BeanPostProcessor接口中的方法,在Bean的自定义初始化方法执行完成之后执行,可以对Bean对象的属性进行修改替换

Spring 中的 bean 生命周期(代码实现)相关推荐

  1. 【Spring学习】Bean生命周期

    我理解的Bean生命周期包括两个方面: Bean何时创建,何时销毁 Bean从创建到销毁的执行流程 一.Bean创建与销毁 Bean的创建时机主要由几个配置项共同来决定,包括: scope属性,决定是 ...

  2. 【Spring系列】- Bean生命周期底层原理

    Bean生命周期底层原理

  3. Spring系列之Bean生命周期

    本文主要以ApplicationContext和BeanFactory容器为例,介绍两者的生命周期流程. ApplicationContext ApplicationContext容器中,Bean的生 ...

  4. Spring IOC和Bean生命周期以及源码分析

    这篇文章主要讲解 IOC 容器的创建过程,让大家对整体有一个全局的认识,文章目录如图: 1. 基础知识 1.1 什么是 Spring IOC ? IOC 不是一种技术,只是一种思想,一个重要的面向对象 ...

  5. Spring如何管理Bean生命周期

    Spring提供两种管理对象生命周期的方式: 1.在使用@Component注解管理Bean组件时候,使用@PostConstruct和@PreDestroy注解管理对象的声明周期方法 a.注意这两个 ...

  6. spring源码bean生命周期篇 一 如何实例化对象

    当前源码springboot版本为2.1.6.RELEASE ,spring版本为5.1.8.RELEASE 代码粘贴的也只有相关重要部分,如果是需要全部的代码请看源码 章节内容 (1) spring ...

  7. spring bean生命周期_Spring中bean的生命周期和扩展点有哪些?

    前言 今天和大家分享一下Spring中Bean的生命周期的一些知识.先来说一下什么是生命周期吧,生命周期从其语义上理解就是一个对象从产生到销毁的整个过程,之所以把这个过程称为生命周期是因为其就像一个生 ...

  8. spring一: 容器以及bean生命周期

    spring框架的几个优点: 1. 轻量级  2. 针对接口编程,解耦合   3. aop编程   4. 方便集成各种优秀框架  5.非侵入式   6.容器 IOC(Inversion of Cont ...

  9. Spring框架:三种Spring Bean生命周期技术

    当使用术语"生命周期"时,Spring的家伙指的是您的bean的构造和破坏,通常这与Spring Context的构造和破坏有关. 在某些情况下,Bean生命周期的管理不是一件容易 ...

  10. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)...

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

最新文章

  1. assignment mismatch: 1 variable but uuid.NewV4 returns 2 values
  2. C#+WebSocket+WebRTC多人语音视频系统
  3. 从 Spark Streaming 到 Apache Flink : 实时数据流在爱奇艺的演进
  4. C语言设计模式——命令模式
  5. puppet3.5源码包安装和配置
  6. 05 吸收应用-会整理还不够?教你吸收、联想、输出、应用
  7. yii模版中的判断方法
  8. vue3代码的组织形式
  9. 蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、全国高校计算机能力挑战赛、软考等大学生编程比赛/考试介绍
  10. AIDA64内存与缓存测试过了算稳定吗_无需XMP默认3200MHz,十铨 开创者 内存开箱简测...
  11. java单例模式——双重检查
  12. win7共享计算机的用户名和密码,win7文件共享访问需要输入用户名和密码如何解决...
  13. 三星手机投屏电脑教程 手机和电脑同屏
  14. 品致高频电流探头的主要特点和连接示波器
  15. java web后台生成随机数字字母验证码
  16. 在excel里插入图表_如何在Excel中锁定图表的位置
  17. Tmux常用命令小结(超全够用)
  18. 全球及中国大健康产业投资潜力与运营价值分析报告2022-2028年
  19. 新手村——C++入门篇
  20. 使用javascript生成Excel表格(内含实例demo),可下载xlsx.core.min.js、excel.js包

热门文章

  1. cad插件物料自动排版_IMEX NO.63:园林景观专业CAD图库
  2. 控制系统分析与设计(一):控制系统分类及建模
  3. linux刷新本地dns命令_如何在Linux上刷新DNS缓存
  4. Mac 如何安装tomcat
  5. 软件工程需求分析-需求规格说明书
  6. 大型网站技术架构(五)--网站高可用架构
  7. 设置火狐 账号服务器,Firefox 账号问答
  8. ubuntu 卸载mysql_Ubuntu16.04彻底卸载MySQL
  9. Arduino 交通灯实验
  10. HTML基础编程——简介及第一行代码