*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

浙公网安备 33010602011771号