SpringFramework:SpringBean的生命周期

SpringFramework:SpringBean的生命周期



一、SpringBean的生命周期

Spring IOC 容器管理的 Bean 默认都是单例设计模式,即每个 Bean 只有一个实例化 Bean 对象存在于 Spring IOC 容器中,因此 Spring IOC 容器负责管理 Bean 的产生,使用和销毁等生命周期。

在这里插入图片描述

1. 实例化 Bean

首先,实例化 Bean:

  • 对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 Bean 时,或初始化 Bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化
  • 对于 ApplicationContext 容器,当容器启动结束后,便实例化所有的 Bean

容器通过获取 BeanDefinition 对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在 BeanWrapper 对象中,BeanWrapper 提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

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

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

2. 填充属性(DI)

实例化后的对象被封装在 BeanWrapper 对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。 紧接着,Spring 根据 BeanDefinition 中的信息进行依赖注入。 并且通过 BeanWrapper 提供的设置属性的接口完成依赖注入。紧接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean。

  • BeanNameAware 的 setBeanName() 方法
  • BeanFactoryAware 的 setBeanDactory() 方法
  • ApplicationContextAware 的 setApplicationContext() 方法

3. 初始化

初始化 Bean,对各项属性赋初始化值。初始化前后执行 BeanPostProcessor,(作用于所有Bean)扩展点方法,对 Bean 进行修改。

4. 销毁

容器关闭后,如果 Bean 实现了 DisposableBean 接口,则会回调该接口的 destroy() 方法。如果配置了destroy-method 方法,则会执行 destroy-method 配置的方法。


二、BeanDefinition

1. 基本概念

一个 Java 对象和一个 Spring Bean 有什么区别?

这是一个经典的面试题,什么是 Java Object ?万物皆对象,在Java内部所有的类,经过创建之后都可以称之为一个对象,SpringBean也是一个java Object, 但是Spring Bean是脱离于 Java Object 的,为什么这么说呢?因为一个 Class 要想变成对象只需要 new 一下,就能够称之为一个对象,但是一个类要想变成一个 Spring Bean 就需要经过一系列的生命周期。

从上面的可以知道,Spring Bean 是一个特殊的 Java Object, 那么他肯定有和 Java Object 有不一样的地方!

Java 中 Class 对象可以描述一个 Java Object,但是因为 Spring Bean 是一个特殊的 JAVA Object,所以 Class 对象不能够完整的描述一个 Spring Bean,所以 Spring 官方单独开发了一个叫做 BeanDefinition 的类,来描述一个 SpringBean !

总结:Java 中 Class 对象可以描述一个 Java Object,但是因为 Spring Bean 是一个特殊的 JAVA Object,所以 Class 对象不能够完整的描述一个 Spring Bean,所以 Spring 官方单独开发了一个叫做 BeanDefinition 的类,来描述一个 SpringBean !

2. 大致结构

BeanDefinition 里面描述了很多的东西,大致包括:ClassName、BaseClassName、是不是懒加载、是不是存在依赖、是不是单例、是否设置@Primary、读取它的beanFactoryMethod、是否存在构造函数参数、构造方法参数、自动注入属性的值 …

它里面存放了Spring创建bean的过程中所需要的一切原料!

3. Spring 构建它的优势

Spring 构建 BeanDefinition 的优势如下:

提升效率:Spring 创建一个类是通过反射创建的,创建类的时候需要一些创建信息,比如 Class,比如注解信息等等,事先将这些信息缓存起来,在创建 Bean 的时候能够直接从缓存中获取从而达到提升创建效率的目的。
方便修改:Spring 创建对象的时候,创建的信息全部是通过 BeanDefinition 内存储的信息来创建对象的,所以,我们可以通过修改 BeanDefinition 内部特定的值来改变 Spring 创建对象的结果!
方便扩展:我们通过一些特定的接口,可以获取到一个类的所有的 BeanDefinition 信息,从而完成一些特定功能的实现!


三、BeanPostProcessor

1. BeanFactoryPostProcessor

我们现在通过上面的了解知道了一件事,就是 Spring 在创建对象之前会把 Class 转换成一个 BeanDefinition , 此时 Spring 为我们提供了一个扩展点,他可以在读取完全部的 Class转换为 BeanDefinition 之后,回调所有实现了 BeanFactoryPostProcessor 接口的实现类,并传入工厂对象,使得使用者能够对工厂对象内部的属性进行修改,例如:对BeanDefinition 内的信息进行修改,以达到操纵最终实例化 Bean 的目的!

说白了,他会在扫描完项目将 Class 转换 为 BeanDefinition 之后在进行实例化之前进行接口的回调!

2. BeanPostProcessor

这个类和上面那个类十分的相似,他有两个方法,两个方法的调用时机也不相同,他会在实例化之后,调用初始化方法之前进行第一次方法回调(postProcessBeforeInitialization),在执行完初始化方法之后又会进行一次回调(postProcessAfterInitialization),每次回调该类都会将当前创建好的 Bean 传递到方法内部,从而让开发者能够自定义的修改当前 Bean 的一些定义!


猜你喜欢

转载自blog.csdn.net/weixin_47410172/article/details/127862460