*finishBeanFactoryInitialization(beanFactory)

初始化所有剩下的单实例bean

1、beanFactory.preInstantiateSingletons();初始化所有的单实例bean

①获取容器中的所有bean,依次初始化对象

②获取bean的定义信息RootBeanDefinition

③bean不是抽象的、是单实例的、是懒加载的

1)判断是否是isFactoryBean;是否是实现FactoryBean接口的bean

2)不是工程bean,利用getBean(beanName);创建对象

0、getBean(beanName);

1、doGetBean(name, null, null, false);

2、先获取缓存中保存的单实例bean,如果能够获取到则说明这个bean之前被创建过了,所有创建过的单实例bean都会被缓存起来getSingleton(beanName);

从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

3、缓存中获取不到,就要创建对象

4、标记当前bean已经被创建markBeanAsCreated(beanName);

5、获取bean的定义信息RootBeanDefinition

6、获取当前bean的依赖其他bean:mbd.getDependsOn();,如果有按照getBean()依赖的Bean先创建出来

7、启动单实例bean的创建流程

1)、createBean(beanName, mbd, args);

2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor拦截bean的创建,从而创建一个代理对象;InstantiationAwareBeanPostProcessor提前执行,触发postProcessBeforeInstantiation如果有返回值,再触发postProcessAfterInstantiation

3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象

4)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);

1)、创建bean实例createBeanInstance(beanName, mbd, args);

利用工厂方法或者bean的构造方法来创建对象

2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法

3)、bean属性赋值populateBean(beanName, mbd, instanceWrapper);

赋值之前

①、拿到InstantiationAwareBeanPostProcessor调用postProcessAfterInstantiation

②、拿到InstantiationAwareBeanPostProcessor调用postProcessPropertyValues

赋值

③、应用Bean属性的值,为属性利用setter方法等进行赋值 applyPropertyValues(beanName, mbd, bw, pvs);

4)、bean的初始化applyPropertyValues(beanName, mbd, bw, pvs);

①invokeAwareMethods(beanName, bean);执行Aware方法:BeanNameAware\BeanClassLoaderAware\BeanFactoryAware

②执行后置处理器初始化之前applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

BeanPostProcessor.postProcessBeforeInitialization()

③invokeInitMethods(beanName, wrappedBean, mbd);

1)、是否是InitializingBean接口的实现、执行接口归档的初始化方法

2)、是否自定义方法

④执行后置处理器初始化之后applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

BeanPostProcessor.postProcessAfterInitialization(result, beanName);

5)、registerDisposableBeanIfNecessary注册bean的销毁方法

5、将创建的bean添加到缓存中singletonObjects

ioc容器就是这些Map:很多的Map里面保存了单实例bean、环境信息。。。

 

所有bean都利用getBean创建完成以后

检查所有的bean是否是SmartInitializingSingleton这个接口的,执行afterSingletonsInstantiated

 

posted @ 2023-02-09 16:56  sugarstar  阅读(29)  评论(0)    收藏  举报