通过全面学习知道了BeanDefinition对象已经创建好了,spring内置对象也创建好了,现在调用beanFactory.preInstantiateSingletons()开始创建对象,循环遍历BeanDefinition,判断当前是否是继承FactoryBean的类,如果是优先创建工厂对象,再判断是否急需创建工厂类中的方法创建子类
通过getBean-》doGetBean
在doGetBean中,判断是否是FactoryBean的子类,且是通过子类中的方法获取对象,实现了第一种创建方式,这种创建的子对象是不在一级缓存中
否则 判断是否单例模式:优先从缓存中获取getSingleton(),
如果缓存中,则调用lambda表达式createBean-》doCreateBean 并调用addSingleton()将返会的对象放入一级缓存中,删除二级和三级缓存
在CreateBean中,第一步判断是否是InstantiationAwareBeanPostProcessor的子接口,如果是调用postProcessBeforeInstantiation()方法进行对象的创建,这是第二种创建方式
如果第一步不成立则调用doCreateBean(),通过createbeanInstance()的方式创建
如果当前BeanDefinition在BeanFactoryPostProcessor过程中被修饰成lambda表达的创建方式,则第三种创建方式
或者通过FactoryMethod的方法创建对象,@Bean就是通过这种方式创建的,在BeanFactoryPostProcessor,将对象属性添加创建方法,实现第四种创建方式
剩下的通过构造器方式,优先判断通过有参,最后通过无参构造器创建对象,此时对象的实例化完成。
浙公网安备 33010602011771号