Spring启动过程中创建bean过程中初始化前部分的代码分析

实例化前的作用

1.初始化前,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessBeforeInitialization()。
2.利用初始化前,可以对进行了依赖注入的Bean进行处理。

使用示例

1.首先必须要添加@Component注解,因为处理器不加入容器是不会被使用的

2.被调用时,这里的bean是已经被实例化而且已经注入属性了(故可以看做是一个完整的实例对象),其次这个处理器是每个Bean对象都要调用的,如果处理只是针对某个Bean,或者某一类Bean,其实是要做区分的。

实例化前逻辑代码展示(这段代码位于 doCreateBean方法#initializeBean(beanName, exposedObject, mbd)方法#applyBeanPostProcessorsBeforeInitialization方法)

代码说明

1.为什么是要遍历全部的BeanPostProcessor,而不是抽出需要的部分形成缓存?

这里面涉及到了接口的继承关系,BeanPostProcessor是顶级接口,也就是最上层的,其余的用于实例化接口InstantiationAwareBeanPostProcessor,合并BeanDefinition的接口MergedBeanDefinitionPostProcessor都是他的子接口,子接口本身会继承父接口的方法,故也不能排除开发者会在其中实现初始化前的方法。所以才会全部拿出来遍历。不过毕竟这些接口都是存于缓存 AbstractBeanFactory类#private final List

2.在Spring源码中的调用:

1)InitDestroyAnnotationBeanPostProcessor会在初始化前这个步骤中执行@PostConstruct的方法。(可查看 注解@PostConstruct分析

2)ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调:

  1. EnvironmentAware:回传环境变量
  2. EmbeddedValueResolverAware:回传占位符解析器
  3. ResourceLoaderAware:回传资源加载器
  4. ApplicationEventPublisherAware:回传事件发布器
  5. MessageSourceAware:回传国际化资源
  6. ApplicationStartupAware:回传应用其他监听对象,可忽略
  7. ApplicationContextAware:回传Spring容器ApplicationContext

Original: https://www.cnblogs.com/chafry/p/16696526.html
Author: 忧愁的chafry
Title: Spring启动过程中创建bean过程中初始化前部分的代码分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616522/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL事务隔离级别锁相关的详解

    MySQL InnoDB引擎中的事务详解! 事务就是可以使一组操作要么全部成功要么全部失败,事务的目的是为了 保证数据的最终一致性。 举个例子: 张三给李四的微信转了1000块红包…

    Java 2023年6月8日
    0131
  • Spring、SpringBoot面试题总结

    开发框架面试题总结 1.spring是什么? 轻量级的开源的J2EE框架。它是⼀个容器框架,⽤来装javabean(java对象),中间层框架(万能胶) 可以起⼀个连接作⽤,⽐如说…

    Java 2023年6月9日
    068
  • 应用系统缓存体系深入研究(Java版)

    一、序言 在使用MyBatis、MybatisPlus等DAO层数据库访问框架式,常常会与一级缓存、二级缓存打交道,为了增强对缓存体系的整体把控力,提高软件应用响应速度,这里对三级…

    Java 2023年6月6日
    072
  • JUC部分并发类使用方式

    下面介绍的是JUC包下一些线程安全类的一些简单使用和一些小demo。 信号量,即可以同时使用的线程数,tryrequire就是将信号量减一,release就是信号量+1,当等于0就…

    Java 2023年6月16日
    057
  • Android 虚拟机总结

    标记出不需要回收的对象,清除没有被标记的对象,它是最基础的收集算法,后续的算法都是对其的不足进行改进。 标记后会产生大量不连续的内存碎片。 将操作区域分为两块,每次只使用一块,当内…

    Java 2023年6月7日
    080
  • MySQL面试题

    MySql项目中使用的存储引擎 5.0之前默认存储引擎为MyISAM引擎 索引只有一种,被索引的字段值作为索引数据,叶子节点还包含该记录数据页地址 不支持事务 没有undo log…

    Java 2023年6月16日
    039
  • Git、TortoiseGit中文安装教程,如何注册Gitee账号进行代码提交,上传代码后主页贡献度没显示绿点(详解)

    今天给大家分享的是 Git 软件和 TortoiseGit 图形化软件的详细安装教程以及如何在 gitee 上进行代码提交。 首先我也是个刚接触 gitee 的一个小白用户,这些都…

    Java 2023年6月15日
    066
  • MySQL 事务基础知识

    数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持 一致性,同时我们还能…

    Java 2023年6月8日
    064
  • Spring-AOP

    AOP操作 百度百科:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一…

    Java 2023年6月8日
    079
  • Java并发工具类

    在 JDK5 之后的并发包中提供的 CountDownLatch 也可以实现 join 的功能,并且比 join 的功能更多 2.CyclicBarrier CyclicBarri…

    Java 2023年5月29日
    084
  • 【转】【WPF】WPF无边框窗体

    窗体部分代码: using System; using System.Collections.Generic; using System.Linq; using System.Te…

    Java 2023年5月29日
    076
  • 计算机的基本认识

    所有图片均为西部开源所有,仅作为随笔所用。 计算机是什么? 计算机的硬件组成 装机 主要设备 有CPU,内存(硬盘,内存条),主板,电脑就能跑起来了CPU拥有核显的话可以不用再装显…

    Java 2023年6月9日
    069
  • Java学习-089-springboot 通过 Spring Initializr 创建服务及IDEA导入后配置更新示例

    进入 Spring Initializr 初始页面,如下所示: 根据实际业务开发需要填写项目的 GAV 信息、打包方式、JDK版本等信息,点击【EXPLORE】根据想到操作下载工程…

    Java 2023年5月29日
    081
  • [springmvc]mvc的多种方式实现请求转发与重定向

    3.restful风格 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。 RESTFUL适用于移动互联网厂商作为业务接…

    Java 2023年6月6日
    093
  • MarkDown 简要语法学习

    MarkDown 简要语法学习 标题 +空格显示标题 多个#代表不同级别标题 ,最多不超过6级。 字体 粗体 ** 斜体 * 粗斜体 *** 删除 ~~ 下划线 引用 一个大于号 …

    Java 2023年6月9日
    071
  • 再也不担心构建问题了

    希望这篇文章可以理清这个工具,了解其使用。 前言 说真的,autotools工具让我很头疼,各种类似的工具 autolocal , automake 以及生产各种相似的文件 Mak…

    Java 2023年5月30日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球