Initialize the given bean instance, applying factory callbacks as well as init methods and bean post processors. Called from createBean for traditionally defined beans, and from initializeBean for existing bean instances.
初始化bean实例,执行工厂回调以及 init 方法和 bean后处理器(BeanPostProcessor)。对于传统定义的bean,从createBean调用,对于现有的bean实例,从initializeBean调用。

上面是方法的注释,我的理解,这个方法按下面的顺序干了4件事情:

  1. invokeAwareMethods;

  2. postProcessBeforeInitialization ;

  3. invokeInitMethods;

    参考:我是spring菜鸟 - 初始化方法
    常用的设定方式有以下三种:
    1、通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
    2、通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
    3、在指定方法上加上@PostConstruct 或 @PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

  4. postProcessAfterInitialization;

0、initializeBean源码

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);// 处理三种类型的Aware接口}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}

1. invokeAwareMethods

这个方法处理三种Aware的子接口,1-BeanNameAware;2-BeanClassLoaderAware;3-BeanFactoryAware
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods

private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}if (bean instanceof BeanFactoryAware) {// AbstractAutowireCapableBeanFactory是DefaultListableBeanFactory和XmlBeanFactory的父类// XmlBeanFactory已经@Deprecated((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}

额外复习,可忽略:
看到invokeAwareMethods方法,我想到了ApplicationContextAware接口(之前写过一篇:ApplicationContextAware在支付系统中的应用).
我在源码中搜了一下setApplicationContext (⭐️ 调试技巧:选中方法名,ctrl+shift+G),发现这里调用了setApplicationContext方法(此时才想起来之前看过这个后置处理器,哎… ).
ApplicationContextAwareProcessor#invokeAwareInterfaces 方法,这个类是BeanPostProcessor。

2、 postProcessBeforeInitialization

下面两个方法不用过多解释,就是把BeanFactory中的 beanPostProcessors 的两个方法都执行一遍 。

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization

@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization

@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}

3、 invokeInitMethods

附录

ApplicationContextAwareProcessor#postProcessBeforeInitialization & invokeAwareInterfaces

org.springframework.context.support.ApplicationContextAwareProcessor#invokeAwareInterfaces

public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {AccessControlContext acc = null;if (System.getSecurityManager() != null &&(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {acc = this.applicationContext.getBeanFactory().getAccessControlContext();}if (acc != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareInterfaces(bean);return null;}, acc);}else {invokeAwareInterfaces(bean);}return bean;}
private void invokeAwareInterfaces(Object bean) {if (bean instanceof Aware) {if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}
}

11、doCreateBean中的initializeBean相关推荐

  1. 如何在PowerBuilder 11.x 中通过ADO.NET访问Sybase ASE?

    之前有一篇文章<如何在PowerBuilder 11.x 中通过ADO.NET访问Oracle>中虽然简单提及了如何通过ADO.NET连接Sybase数据库,但实际上很多客户,包括我们自己 ...

  2. 802.11协议中的广播与tcp/ip中的广播

    这两种广播经常一起用,有时候总是分不清楚,这里记录一下以备忘. 先说一下802.11协议中的广播,也就是通常所说的WiFi协议中的广播.它是指目的地址为FF:FF:FF:FF:FF:FF的帧,目的地址 ...

  3. Java黑皮书课后题第7章:*7.20(修改选择排序法)在7.11节中,使用了选择排序法对数组排序。改写7.11节程序,重复地在当前数组中找到最大值,然后将这个最大值与该数组中的最后一个数进行交换

    7.20(修改选择排序法)在7.11节中,使用了选择排序法对数组排序.改写7.11节程序,重复地在当前数组中找到最大值,然后将这个最大值与该数组中的最后一个数进行交换 题目 题目描述 破题 代码 运行 ...

  4. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  5. 苹果手机中计算机功能是什么,如何将苹果11手机中的内容和隐私访问限制功能关闭...

    如何将苹果11手机中的内容和隐私访问限制功能关闭 腾讯视频/爱奇艺/优酷/外卖 充值4折起 如何将苹果11手机中的内容和隐私访问限制功能关闭呢?一起看看具体操作步骤吧. 1. 解锁手机后,找到设置图标 ...

  6. linux英伟达显卡内核不匹配,硬核观察|Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞...

    Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞 据 cnbeta 报道,曾因闭源驱动对英伟达爆粗口的 Linus Torvalds,刚刚宣布了 Linux 5.11 内核版本的 ...

  7. 在Suse Linux 11 SP4中启动eclipse时的Failed to load module pk-gtk-module异常

    在SUSE Linux 11 SP4中,执行eclipse &以启动Eclipse时出现如下警告(Eclipse可以正常启动,但是在Shell中会提示如下异常): Gtk-Message: F ...

  8. 在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密

    在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密 How to disable BitLocker on Windows 11 for ASUS ROG S ...

  9. C++11开发中的Atomic原子操作

    C++11开发中的Atomic原子操作 Nicol的博客铭 原文  https://taozj.org/2016/09/C-11%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84 ...

最新文章

  1. Java Script 第四节课 Java Script的隐式转换
  2. mysql sum计算效率很慢_MySQL--RDS下的分区表实践(文末附MySQL视频教程与面试题)...
  3. 分布式项目启动时报错:Duplicate spring bean id XXX
  4. 中国生物质锅炉行业全景调研与投资前景研究分析报告2021-2027年
  5. kafka创建topic_一网打尽Kafka常用命令、脚本及配置,宜收藏!
  6. java springmvc mybatis mysql
  7. 华为鸿蒙系统学习笔记5-华为方舟编译器正式开源及相关源码下载
  8. 科学院开放资源github_什么是开放科学?
  9. 全国计算机信息大赛noi,全国青少年信息学竞赛NOI系列赛事汇总
  10. 创建图片mat_Python骚操作,让图片人物动起来!
  11. C++学习 8.2 - 类及类成员
  12. CMU 15-213 Introduction to Computer Systems学习笔记(3) Floating Point
  13. Tabular Editor学习笔记_1
  14. Word文档中标题前面的黑点如何去掉
  15. 创业公司一年工作总结
  16. JAVA 面向对象和集合知识点总结
  17. python百度地图和租房信息_python爬虫租房信息在地图上显示的方法
  18. day08学习 Python文件函数、CSV文件读写
  19. Oracle HINT的常见用法
  20. 记忆圆周率前二十位(耳机向)

热门文章

  1. Web图形开发方案选型,SVG/VML/Flash/Applet优劣比较
  2. linux然后防止ip欺骗,linux – 如何在iptables中防止ip欺骗?
  3. go结构体初始化_golang中结构体的初始化方法(new方法) | 学习笔记
  4. 什么是决定计算机内部寄存器,问题解答之 计算机中寄存器定义,分类
  5. 计算机三级之嵌入式系统学习笔记1
  6. java去掉mongodb日志_JAVA开发 Mongodb3.0以上 去掉控制台DEBUG信息
  7. 启动多个线程后同时并行执行程序
  8. java进程因机器内存不足被系统kill的定位
  9. springboot启动图标_SpringBoot基础教程
  10. java两个对象属性比较