上篇(spring源码学习_bean工厂的初始化)有说到,bean工厂初始化的最后一步就是将所有剩下的,在beanDefinitionMap中注册的,需要被实例化的bean全部实例化。其实例化过程最终是又 getBean 方法完成的,这里我们就重点看看getBean方法。
1.bean的实例化过程
public<T> T getBean(String name,@Nullable Class<T> requiredType,@Nullable Object...args)throws BeansException{
return doGetBean(name,requiredType,args,false);
}
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
//这里去掉工厂bean的前缀或者将别名转化为规范名
final String beanName = transformedBeanName(name);
Object bean;
//这里尝试直接从singletonObjects(单例池)中获取bean的实例
//最终被实例化的单例bean,都会被存放在singletonObjects中
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
//如果是工厂bean,获取工厂bean创建的bean,普通bean则直接返回
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
//如果这个bean已经在创建了,则抛出异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
//获取父工厂
BeanFactory parentBeanFactory = getParentBeanFactory();
//当父工厂存在时,将实例化任务交给父工厂
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
//......省略
//这里调用了父工厂的getBean方法
}
if (!typeCheckOnly) {
//将这个bean标记为已实例化状态
markBeanAsCreated(beanName);
}
try {
//获取到这个bean的 beanDefinition
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
//这里检查了这个bean是否是Abstract的,是则抛出异常
checkMergedBeanDefinition(mbd, beanName, args);
//获取到这个bean的依赖信息
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
//检查是否已经注册过该依赖