调用流程
- 预实例化,或者手动getBean,都会进入下述流程
- AbstractBeanFactory.getBean(String name)
- AbstractBeanFactory.doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
- 先看cache:Object sharedInstance = getSingleton(beanName),第一次嘛,自然是null
- 在parent存在,并且自己的beanDefinitionMap不含该beanName时,才让parent来getBean
- 把beanName塞进Set<String> alreadyCreated
- 根据beanName拿到RootBeanDefinition
- RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName),这里也有一个缓存
- 利用RootBeanDefinition拿到依赖数组
- String[] dependsOn = mbd.getDependsOn()
- 这个和属性注入无关,查看@DependsOn
- 根据单例,prototype,自定义scope进行处理
- 利用反射,通过无参构造函数实例化
- populateBean
- 属性注入
- initializeBean
问答
如何保证单例
- DefaultSingletonBeanRegistry.getSingleton方法中,以singletonObjects作为同步块,并有double check