spring源码学习(二)
本篇文章,来介绍finishBeanFactoryInitialization(beanFactory);这个方法主要是完成bean的实例化,
invokeBeanFactoryPostProcessors(beanFactory);负责把所有的bean扫描到beanDefinitionMap中;
下面来说是如何初始化的
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
我们直接从这个方法开始说起,前面的调用链简单,就不说了
1 protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, 2 @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { 3 4 /** 5 * 通过name获取beanName,这里不使用name直接作为beanName有两个原因: 6 * 1.name可能是以&开头的,表明调用者想获取FactoryBean本身,而非FactoryBean;在beanFactory中factoryBean的存储也是map格式 7 * <beanName,bean> 只是说,普通的beanName是没有&这个字符串的,所以,需要将name的首字母移除,这样才能从缓存中拿到factoryBean 8 * 2.还是别名的问题,需要转换 9 */10 final String beanName = transformedBeanName(name); 11 Object bean; 12 13 /**14 * 1.从单例池中获取当前bean 15 * 2.这里是循环依赖的重要方法之一 16 * 17 */18 // Eagerly check singleton cache for manually registered singletons.19 Object sharedInstance = getSingleton(beanName); 20 if (sharedInstance != null && args == null) { 21 if (logger.isDebugEnabled()) { 22 if (isSingletonCurrentlyInCreation(beanName)) { 23 logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +24 "' that is not fully initialized yet - a consequence of a circular reference"); 25 } 26 else { 27 logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); 28 } 29 } 30 bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); 31 } 32 33 else { 34 // Fail if we're already creating this bean instance: 35 // We're assumably within a circular reference.36 /**37 * 这里判断bean是否在创建过程中,是第二次调用的时候 才会判断;如果是第一次执行到这里,set集合是空(这里判断的是原型bean) 38 */39 if (isPrototypeCurrentlyInCreation(beanName)) { 40 throw new BeanCurrentlyInCreationException(beanName); 41 } 42 43 //添加到alreadyCreated集合当中,表示当前bean已经创建过一次了44 if (!typeCheckOnly) { 45 markBeanAsCreated(beanName); 46 } 47 48 try { 49 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); 50 checkMergedBeanDefinition(mbd, beanName, args); 51 52 // Guarantee initialization of beans that the current bean depends on.53 String[] dependsOn = mbd.getDependsOn(); 54 if (dependsOn != null) { 55 for (String dep : dependsOn) { 56 if (isDependent(beanName, dep)) { 57 throw new BeanCreationException(mbd.getResourceDescription(