执行finishBeanFactoryInitialization
执行preInstantiateSingletons
preInstantiateSingletons方法中的
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
里面就包含xml定义的a和b这两个bean。
a和b没有明显的创建顺序。
在创建对象的整个过程中有6个重要且标准的方法。
以do开始的方法基本上是实际干活的方法,包含了非常多的真实的处理逻辑。
创建任何对象之前都要先做一个预判,判断容器里面是否有该对象。
查询容器中是否包含a对象,返回null,说明容器中还没有,所以只能创建。
然后进入第三个方法createBean
这段代码就是ObjectFactory,lambda表达式就是ObjectFactory的调用过程。
createBean并不会真正的执行lambda表达式,而是在调用getObject方法的时候才会执行lambda表达式。
在getSingleton方法中会调用getObject方法
如果一级缓存不存在该对象,则将key=a,value=lambda表达式放入三级缓存。
在对象属性设置之前,已经把K=a,value=lambda表达式放入了三级缓存,注意这里放入的并不是a对象,而是包含a对象的lambda表达式。
接下来就是填充对象属性,给属性赋值。
这是第二次看到getBean了。
本来是要给a中的b属性赋值的,通过名称判断之后,发现没有b对象,所以要去容器中查找b对象即对应到标红的这一步。
然后又经过上述一系列的步骤,实例化了B对象,属性a为null。
然后接着把key=b,value=lambda表达式放入三级缓存,然后给b的属性值a赋值