前面的文章介绍了Spring Bean中属性自动注入的实现原理(Autowired注解都会用,那么你知道它实现自动注入的原理吗),当时提到还有一种特殊的注入过程(通过构造方法注入属性)的实现原理有些不一样,需要单独另外介绍,今天我们就一起来看看带参数的Bean是如何被创建的。
通过构造方法注入属性的Demo
我们先用一个简单的示例来看看通过构造方法注入属性的使用方法是怎样的。
Java代码:
xml配置文件:
运行结果:
从Demo中可以看到,通过构造方法实现属性注入并不需要有特别的设置,使用上是非常的方便的。
通过构造方法注入属性的实现原理
通过上面的Demo我们看到了构造方法注入属性的用法和效果了,接下来我们就来看看它的实现原理。
首先我们在对应的构造方法上面打个断点,启动程序,进入断点后我们可以得到如下的调用堆栈:
通过这个调用堆栈,我们大体可以知道整个实现过程:
在创建Bean的时候,发现需要通过注入属性创建的时候,就调用autowireConstructor方法来完成Bean的创建,该方法最终是通过反射的方式完成创建的。
接下来我们就终点分析这个autowireConstructor方法。这个方法的代码比较长,基本执行流程如下图:
Spring是如何选择最合适的构造方法的
一个BeanClass往往可能存在多个构造方法,Spring在初始化Bean的时候就需要从这些构造方法中寻找到一个最合适的方法,那么它是按照哪种逻辑来查找的呢?
首先会计算一下最少要求的参数个数:指定参数的个数或者是XML配置文件中配置的参数个数。
然后对构造方法列表进行排序,参数个数多的排前面,这样可以加快寻找到最优构造方法。
最后循环遍历每一个构造方法,从中计算最合适的方法,计算过程为:
Autowired注解都会用,那么你知道它实现自动注入的原理吗
Spring boot启动过程(续)
对Spring实现原理感兴趣的朋友可以点个关注,接下来的一段时间我将会从Spring的源代码入手,详细的介绍Spring的实现原理。
知其然,更要知其所以然,方能融会贯通!