所在的位置: java >> 培训学校 >> SpringIoCcreateBean方

SpringIoCcreateBean方

本篇文章主要分析SpringIoC的createBean()方法的流程,以及bean的生命周期。下面是一个大致的流程图:

正文AbstractAutowireCapableBeanFactory#createBean

上面方法如果resolveBeforeInstantiation()返回非null,则会跳过后面步骤,直接返回实例。这也是一个扩展点,给BeanPostProcessor一个机会来返回代理来替代真正的实例。

AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation

上面方法主要是判断bean之前没有解析过并且有注册InstantiationAwareBeanPostProcessor接口,然后这里会调用bean实例化前的回调方法,如果返回非空,会调用bean实例化后的回调方法;因为返回非空,后续正常的流程都不会走了,所以只能在此处调用。

下面是InstantiationAwareBeanPostProcessor接口,如下:

上面接口提供了三个扩展点,如下:

bean实例化前bean实例化后bean属性赋值前这也是bean实例化的生命周期回调方法。

AbstractAutowireCapableBeanFactory#doCreateBean

AbstractAutowireCapableBeanFactory#createBeanInstance

上面代码主要判断是使用构函数自动注入,还是使用默认构造函数构造。总结起来以下几种情况会使用构造函数自动注入:

已经缓存过构造函数并且构造函数的参数已经解析过。候选的构造函数不为空,这里的候选构造函数是通过实现SmartInstantiationAwareBeanPostProcessor接口中的determineCandidateConstructors()自动注入模式为构造函数自动注入BeanDefinition定义了构造函数参数,如XML中的constructor-argindex=0value=1/在调用getBean()时显示指定了args参数AbstractAutowireCapableBeanFactory#instantiateBean

上面代码比较简单,无非就是使用默认的无参构造器去实例化bean,并封装成BeanWrapper返回。

ConstructorResolver#autowireConstructor

上面代码的功能主要如下:

1.构造函数参数的确定

如果explicitArgs参数不为空,那就可以直接确定参数。因为explicitArgs参数是在调用getBean()时手动指定的,这个主要用于静态工厂方法的调用。缓存中不为空,那么可以直接拿过来使用。BeanDefinition中读取,我们所定义的bean都会生成一个BeanDefinition,其中记录了定义了构造函数参数通过getConstructorArgumentValues()获取。2.构造函数的确定。经过第一步已经确定构造函数的参数,接下来就是用参数个数在所有的构造函数中锁定对应的构造函数。匹配之前会对构造函数进行排序,首先是public构造函数且参数个数从多到少,然后是非public构造函数且参数个数有多到少。这样可以迅速判断排在后面的构造函数参数个数是否符合条件。

3.根据对应的构造函数转换对应的参数类型。

4.根据实例化策略以及得到的构造函数和构造函数参数实例化bean。

ConstructorResolver#resolveConstructorArguments

上面代码主要将indexedArgumentValues和genericArgumentValues的值调用resolveValueIfNecessary()进行解析;resolveValueIfNecessary()主要解析参数的类型,比如ref属性引用的beanName会通过getBean()返回实例。

ConstructorResolver#createArgumentArray

上面代码判断构造函数如果有匹配的参数会转换成对应类型,如果没有匹配的参数,多半是构造函数自动注入,通过resolveAutowiredArgument()去查找bean并返回实例。

ConstructorResolver#resolveAutowiredArgument

上面代码我们一般只需要重点


转载请注明:http://www.jiaju1314.com/pxxx/pxxx/16552.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了