【Spring源码系列- IOC】
本文目录
今天是instantiateUsingFactoryMethod()的主场,这是createBeanInstance()方法中关于factory-method创建对象的关键函数,这是一个行数300+的函数,你值得了解 >> 机智脸.gif
首先,我们先找到它
构建构造器处理器并使用factoryMethod进行实例化操作
再次进入名为instantiateUsingFactoryMethod()的方法,这次进入的才是开头提到个行数300+的方法(b_d)
开始捋流程
创建+初始化实例包装类
判断factoryBeanName是否存在
-
如果存在,则说明是实例工厂进行创建的,再进一步获取factoryBean,并将isStatic设为false(非静态的)
-
如果不存在工厂实例,则说明是通过静态工厂来创建,将isStatic设为true(静态的)
然后是解析参数的步骤
factoryMethod和args的相关判断,如果没解析过,就获取factoryClass的用户定义类型,因为此时factoryClass可能是CGLIB动态代理类型,所以要获取父类的类型
然后通过方法的数量判断是否存在重载
-
如果工厂方法是唯一的,就是没重载的,就获取解析的工厂方法
-
如果获取到的工厂方法不为空,就添加到一个不可变列表里;
-
如果为空的话,就要去找出factoryClass的以及父类的所有方法,进一步找出方法修饰符一致且名字跟工厂方法名字相同的且是bean注解的方法,并放入列表里
-
-
如果没找到,则说明可能有重载,那么则获取factoryClass以及父类的所有方法作为候选方法
-
如果获取到的候选方法只有一个,且传入的参数为空,且没有设置构造方法参数,就进行一系列的相关参数设置,然后返回BeanWrapperImpl对象
-
如果获取到的候选方法大于一个,则先进行排序操作(public优先,参数多的)
-
随后是一系列参数的相关判断
下一步,通过一个for循环遍历每个候选的方法,查看可以获取实例的匹配度
如果上面的都执行完了,一开始定义的factoryMethodToUse和argsToUse还都是空,则需要跑出血了些异常叻(看到图中的throw了嘛˶(‾᷄ ⁻̫ ‾᷅˵)/0
最后,实例化并设置到BeanWrapperImpl中
其中有一个很重要的方式createArgumentArray()
createArgumentArray()
搞定(。・ω・。)ノ撒个花🎉