0%

Spring bean解析篇深入分析了一个配置文件经历了哪些过程转变成了BeanDefinition,但是这个BeanDefinition并不是我们真正想要的想要的bean,因为它还仅仅只是承载了我们需要的目标bean的信息,从BeanDefinition 到我们需要的目标还需要一个漫长的 bean 的初始化阶段,在Spring bean 实例化阶段已经详细分析了初始化 bean 的过程,所以这里做一个概括性的总结。

bean的初始化节点由第一次调用getBean()(显式或者隐式)开启,所以我们从这个方法开始。

阅读全文 »

spring源码解析之 28 深入分析InitializingBean接口和init-method

已经分析Aware接口和 BeanPostProcessor 接口,这篇分析 InitializingBean接口和 init-method 方法。

InitializingBean

Spring 的 InitializingBean 接口为 bean 提供了定义初始化方法的方式,它仅包含了一个方法:afterPropertiesSet()

阅读全文 »

Spring作为优秀的开源框架,它为我们提供了丰富的可扩展点,除了前面提到的Aware接口,还包括其他部分,其中一个很重要的就是BeanPostProcessor。这篇文章主要介绍BeanPostProcessor的使用以及其实现原理。我们先看BeanPostProcessor的定位:

BeanPostProcessor的作用:在Bean完成实例化后,如果我们需要对其进行一些配置、增加一些自己的处理逻辑,那么请使用BeanPostProcessor。

阅读全文 »

我们经过前面的解析,已经知道了如何创建一个bean。但是在在上一篇博客bean的初始化中,说道bean的初始化initializeBean会做以下三件事,分别是:

  1. 激活Aware方法
  2. 后置处理器的应用
  3. 激活自定义的 init 方法

虽然我们分析了这部分的源码,但是没有仔细分析,所以接下来三篇文章,会分别对这三个进行仔细分析。单独拿出来说的原因,是他们都是spring提供给我们可以使用的扩展机制。这里先来分析Aware接口

阅读全文 »

spring源码解析之 25 bean的初始化

前面我们已经分析了bean的创建,属性的注入,依赖处理,其实这时bean基本上已经可以用了,不知道你还记不记得我们在xml中还可以配置init-method属性,这个到现在为止还没有处理,这就是最后一步初始化,也就是 initializeBean(),所以这篇文章我们分析 doCreateBean() 中最后一步:初始化 bean。

阅读全文 »

这篇分析 doCreateBean() 第三个过程:循环依赖处理。其实循环依赖并不仅仅只是在 doCreateBean() 中处理,其实在整个加载 bean 的过程中都有涉及,所以下篇内容并不仅仅只局限于 doCreateBean(),而是从整个 Bean 的加载过程进行分析。

阅读全文 »

doCreateBean() 主要用于完成 bean 的创建和初始化工作,我们可以将其分为四个过程:

  • createBeanInstance() 实例化bean
  • populateBean() 属性填充
  • 循环依赖的处理
  • initializeBean() 初始化bean

第一个过程实例化 bean 已经在前面两篇博客分析完毕了,这篇博客开始分析属性填充,也就是 populateBean(),该函数的作用是将BeanDefinition中的属性值赋值给BeanWrapper实例对象(对于BeanWrapper 我们后续专门写文分析)。

阅读全文 »

在上篇博客中有一个核心方法没有讲到 createBean() ,该方法的如下:

1
2
protected abstract Object createBean(String beanName, RootBeanDefinition mbd, 
@Nullable Object[] args) throws BeanCreationException;

该方法定义在AbstractBeanFactory中。其含义是根据给定的BeanDefinition和args实例化一个bean对象,如果该BeanDefinition存在父类,则该BeanDefinition已经合并了父类的属性。所有Bean实例的创建都会委托给该方法实现。

阅读全文 »