天天看点

一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

在前面的两篇博文《一次性讲清楚spring中bean的生命周期之一:getSingleton方法》和《一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今生》中分析了spring中bean生命周期的过程中的getSingleton方法和getObjectForBeanInstance方法,今天来分析另外一个重要的方法createBean方法。分析的入口是AbstractBeanFacotry.doGetBean方法,如下图,

一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

这就是本次分析的入口。下面看该方法的详细定义,AbstractAutowireCapableBeanFactory.createBean

重点部分已用红色标出,下面具体来分析

bean生命周期前

在上面的方法定义中有这样一段代码,

就是说在进入bean的创建之前,开发者可以自己返回一个目标类的代理类,如果返回了那么便直接返回,不会继续向下执行。看该方法怎么实现的,AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation

该方法重要的就是applyBeanPostProcessorsBeforeInstantiation和applyBeanPostProcessorsAfterInitalization方法。

该方法的主要作用是如果在spring中有InstantiationAwareBeanPostProcessor类型的beanPostProcessor的化,会执行其postProcessBeforeInstantiation方法,也就是我们可以实现InstantiationAwareBeanPostProcessor接口,并实现其postProcessBeforeInstantiation方法。默认情况下该接口的方法返回null,

回过头来看另外一个方法,

BeanPostProcessor接口中该方法默认返回如下

在spring容器中会有多少BeanPostProcessor这个后面会分析。

分析完了进入bean生命周期前的方法,也就是留个开发者一个后门,通过实现InstantiationAwareBeanPostProcessor接口中的postProcessBeforeInstantiation方法可以自定义返回一个目标类型的代理对象。现在回到createBean方法中,真正进入bean的生命周期,看doCreateBean方法,

doCreateBean

该方法的篇幅过长,仅保留关键代码,其他代码删除,请知悉,

 看createBeanInstance方法

该方法的定义如下,

从上面的方法中可以看出实例化bean,其实就是使用类的构造方法来进行实例化,这里看下instantiateBean方法的过程,

看该方法的定义,

从上面的代码可以看到该方法中重要的就是下面这句

看下getInstantiationStrategy()方法返回什么,

返回的是一个属性,

是一个CglibSubclassingInstantiationStragegy对象,看其instantiate方法,由于CglibSubclassingInstantiationStrategy继承了SimpleInstantiationStrategy类,该方法在父类SimpleInstantiationStrategy中

从上面可以看出有两种方式生成实例,使用反射的机制

如果有lookup或replaced,使用cglib方式

标红的代码就是生成的逻辑,可以看到是利用的java的反射机制,也就是使用Constructor类的newInstance方法。

该方法在CglibSubclassingInstantiationStrategy中

使用的是CglibSubclassCreator生成的实例,具体方式就是cglib生成代理类的方式,

分析完毕spring中单例bean的实例化过程。

总结

至此分析完了spring中单例bean的实例化过程,主要有两点,

1、类中有lookup或replaced方式,使用cglib的方式生成bean的实例;

2、类中无lookup或replaced方式,使用java反射机制Constructor生成实例;

一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗