通过AbstractApplicationContext.refresh()方法调用finishBeanFactoryInitialization()方法进行bean的创建。
/** * 完成bean的创建 * Finish the initialization of this context's bean factory, * initializing all remaining singleton beans. */protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // Initialize conversion service for this context. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) { beanFactory.setConversionService( beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); } // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); } // Stop using the temporary ClassLoader for type matching. beanFactory.setTempClassLoader(null); // Allow for caching all bean definition metadata, not expecting further changes. beanFactory.freezeConfiguration(); //主要完成bean对象的实例化 // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons();}
DefaultListableBeanFactory:主要完成bean的实例化、以及存储XmlBeanDefinitionReader解析resource注册到beanFactory中的BeanDefinition;数据结构如下:
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { //......................... //存储由XmlBeanDefinitionReader解析资源文件中的BeanDefinition /** Map of bean definition objects, keyed by bean name */ private final MapbeanDefinitionMap = new ConcurrentHashMap (64); /** Map of singleton and non-singleton bean names keyed by dependency type */ private final Map , String[]> allBeanNamesByType = new ConcurrentHashMap , String[]>(64); /** Map of singleton-only bean names keyed by dependency type */ private final Map , String[]> singletonBeanNamesByType = new ConcurrentHashMap , String[]>(64); /** List of bean definition names, in registration order */ private final List beanDefinitionNames = new ArrayList (); /** Whether bean definition metadata may be cached for all beans */ private boolean configurationFrozen = false; /** Cached array of bean definition names in case of frozen configuration */ private String[] frozenBeanDefinitionNames; //.....................}
初始化单列bean对象,其中bean对象包括普通的bean对象和实现FactoryBean接口的bean对象;通过beanFactory获取FactoryBean对应的bean对象实际是通过FactoryBean.getObject()方法获取的。
@Overridepublic void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("Pre-instantiating singletons in " + this); } ListbeanNames; synchronized (this.beanDefinitionMap) { // Iterate over a copy to allow for init methods which in turn register new bean definitions. // While this may not be part of the regular factory bootstrap, it does otherwise work fine. beanNames = new ArrayList (this.beanDefinitionNames); } for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { //判断bean类型 if (isFactoryBean(beanName)) { //获取FactoryBean本身需要前缀“&” final FactoryBean factory = (FactoryBean ) getBean(FACTORY_BEAN_PREFIX + beanName); boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged(new PrivilegedAction () { @Override public Boolean run() { return ((SmartFactoryBean ) factory).isEagerInit(); } }, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean ) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); } } else {//普通bean的创建 getBean(beanName); } } }}/** * Return an instance, which may be shared or independent, of the specified bean. * @param name the name of the bean to retrieve * @param requiredType the required type of the bean to retrieve bean类型 * @param args arguments to use if creating a prototype using explicit arguments to a * static factory method. It is invalid to use a non-null args value in any other case. * args是prototype所需的参数 * @param typeCheckOnly whether the instance is obtained for a type check, 是否是类型检查 * not for actual use * @return an instance of the bean * @throws BeansException if the bean could not be created */@SuppressWarnings("unchecked")protected T doGetBean( final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); } } bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // Fail if we're already creating this bean instance: // We're assumably within a circular reference. if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // Check if bean definition exists in this factory. BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { // Not found -> check parent. String nameToLookup = originalBeanName(name); if (args != null) { // Delegation to parent with explicit args. return (T) parentBeanFactory.getBean(nameToLookup, args); } else { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); } } if (!typeCheckOnly) { markBeanAsCreated(beanName);//标记bean已创建 } try { //获取BeanDefinition final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); //检查BeanDefinition是否是Abstract,或者是否是Prototype等处理 checkMergedBeanDefinition(mbd, beanName, args); //获取bean的依赖 // Guarantee initialization of beans that the current bean depends on. String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dependsOnBean : dependsOn) { //判断循环依赖 if (isDependent(beanName, dependsOnBean)) { throw new BeanCreationException("Circular depends-on relationship between '" + beanName + "' and '" + dependsOnBean + "'"); } registerDependentBean(dependsOnBean, beanName); getBean(dependsOnBean); } } //1、创建SingleBean // Create bean instance. if (mbd.isSingleton()) { //创建单实例bean sharedInstance = getSingleton(beanName, new ObjectFactory