前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统学习SpringFramework:SpringBean的生命周期

系统学习SpringFramework:SpringBean的生命周期

作者头像
栗筝i
发布2022-12-01 21:43:15
2430
发布2022-12-01 21:43:15
举报
文章被收录于专栏:迁移内容迁移内容

本篇内容包括:SpringBean的生命周期的四个主要步骤(即 实例化 Bean,填充属性(DI),初始化,销毁)、BeanDefinition 的概念 以及 BeanFactoryPostProcessor 和 BeanPostProcessor 的相关内容。

一、SpringBean的生命周期

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

img
img
1、实例化 Bean

首先,实例化 Bean:

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

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

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

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

2、填充属性(DI)

接下来,填充属性(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 的一些定义!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SpringBean的生命周期
    • 1、实例化 Bean
      • 2、填充属性(DI)
        • 3、初始化
          • 4、销毁
          • 二、BeanDefinition
            • 1、基本概念了解
              • 2、大致结构
                • 3、Spring 构建它的优势
                • 三、BeanPostProcessor
                  • 1、BeanFactoryPostProcessor
                    • 2、BeanPostProcessor
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档