AbstractApplicationContext public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh();// // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //new出DefaultListableBeanFactory 加载BeanDefinitions // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // 执行所有的 BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor //BeanFactoryPostProcessor 比如PropertyPlaceholderConfigurer替换${} //BeanDefinitionRegistryPostProcessor 比如MapperScannerConfigurer注册动态代理生成的dao实例 // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); //按顺序注册实现了PriorityOrdered Ordered 无序 的BeanPostProcessor //挑选出MergedBeanDefinitionPostProcessor最后注册 注册时候会排重 加入到beanFactory的一个list中 // Initialize message source for this context. initMessageSource();//初始化属性messageSource 若容器中没有使用默认的DelegatingMessageSource // Initialize event multicaster for this context. initApplicationEventMulticaster();//初始化属性applicationEventMulticaster 若容器中没有使用默认的SimpleApplicationEventMulticaster // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners();//applicationEventMulticaster加入容器中的ApplicationListener // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory);//实例化所有的non-lazy-init // Last step: publish corresponding event. finishRefresh(); //实例化属性lifecycleProcessor 若容器没有使用DefaultLifecycleProcessor //lifecycleProcessor.onRefresh() //发布ContextRefreshedEvent } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } } //关闭容器 protected void doClose() { boolean actuallyClose; synchronized (this.activeMonitor) { actuallyClose = this.active && !this.closed; this.closed = true; } if (actuallyClose) { if (logger.isInfoEnabled()) { logger.info("Closing " + this); } LiveBeansView.unregisterApplicationContext(this); try { // Publish shutdown event. publishEvent(new ContextClosedEvent(this)); } catch (Throwable ex) { logger.warn("Exception thrown from ApplicationListener handling ContextClosedEvent", ex); } // Stop all Lifecycle beans, to avoid delays during individual destruction. try { getLifecycleProcessor().onClose(); } catch (Throwable ex) { logger.warn("Exception thrown from LifecycleProcessor on context close", ex); } // Destroy all cached singletons in the context's BeanFactory. destroyBeans(); // Close the state of this context itself. closeBeanFactory(); // Let subclasses do some final clean-up if they wish... onClose(); synchronized (this.activeMonitor) { this.active = false; } } } AbstractAutowireCapableBeanFactory @Override protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) throws BeanCreationException { if (logger.isDebugEnabled()) { logger.debug("Creating instance of bean '" + beanName + "'"); } // Make sure bean class is actually resolved at this point. resolveBeanClass(mbd, beanName); // Prepare method overrides. try { mbd.prepareMethodOverrides(); } catch (BeanDefinitionValidationException ex) { throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", ex); } try { // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. //使用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()得到bean 如果不为null //接着执行所有的BeanPostProcessor.postProcessAfterInitialization() Object bean = resolveBeforeInstantiation(beanName, mbd); if (bean != null) { return bean; } } catch (Throwable ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", ex); } Object beanInstance = doCreateBean(beanName, mbd, args); if (logger.isDebugEnabled()) { logger.debug("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; } /** * Actually create the specified bean. Pre-creation processing has already happened * at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks. * <p>Differentiates between default bean instantiation, use of a * factory method, and autowiring a constructor. * @param beanName the name of the bean * @param mbd the merged bean definition for the bean * @param args arguments to use if creating a prototype using explicit arguments to a * static factory method. This parameter must be {@code null} except in this case. * @return a new instance of the bean * @throws BeanCreationException if the bean could not be created * @see #instantiateBean * @see #instantiateUsingFactoryMethod * @see #autowireConstructor */ protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args);//生成一个实例 } final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null); // Allow post-processors to modify the merged bean definition. synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);//执行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() mbd.postProcessed = true; } } // Eagerly cache singletons to be able to resolve circular references // even when triggered by lifecycle interfaces like BeanFactoryAware. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isDebugEnabled()) { logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references"); } addSingletonFactory(beanName, new ObjectFactory() {//单例类添加到SingletonBeanRegistry的map中缓存 public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); } // Initialize the bean instance. Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper);//初始化 //执行InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 有一个为false则返回 //设置mdb里面autowire的属性,从beanFactory里面取 //InstantiationAwareBeanPostProcessor.postProcessPropertyValues //BeanWrapper中完成设置bean的属性 if (exposedObject != null) { exposedObject = initializeBean(beanName, exposedObject, mbd); //初始化后执行一些方法 //BeanNameAware.setBeanName //BeanClassLoaderAware.setBeanClassLoader //BeanFactoryAware.setBeanFactory //BeanPostProcessor.postProcessBeforeInitialization //InitializingBean.afterPropertiesSet //initMethod //BeanPostProcessor.postProcessAfterInitialization // } } catch (Throwable ex) { if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { throw (BeanCreationException) ex; } else { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); } } if (earlySingletonExposure) { Object earlySingletonReference = getSingleton(beanName, false); if (earlySingletonReference != null) { if (exposedObject == bean) { exposedObject = earlySingletonReference; } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { String[] dependentBeans = getDependentBeans(beanName); Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length); for (String dependentBean : dependentBeans) { if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { actualDependentBeans.add(dependentBean); } } if (!actualDependentBeans.isEmpty()) { throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been " + "wrapped. This means that said other beans do not use the final version of the " + "bean. This is often the result of over-eager type matching - consider using " + "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."); } } } } // Register bean as disposable. try { registerDisposableBeanIfNecessary(beanName, bean, mbd); //实现DisposableBean的bean加入到beanFactory的disposableBeans Map中 } catch (BeanDefinitionValidationException ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex); } return exposedObject; } //容器关闭时 销毁bean DisposableBeanAdapter public void destroy() { if (this.beanPostProcessors != null && !this.beanPostProcessors.isEmpty()) { for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) { processor.postProcessBeforeDestruction(this.bean, this.beanName); } } if (this.invokeDisposableBean) { if (logger.isDebugEnabled()) { logger.debug("Invoking destroy() on bean with name '" + this.beanName + "'"); } try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { ((DisposableBean) bean).destroy(); return null; } }, acc); } else { ((DisposableBean) bean).destroy(); } } catch (Throwable ex) { String msg = "Invocation of destroy method failed on bean with name '" + this.beanName + "'"; if (logger.isDebugEnabled()) { logger.warn(msg, ex); } else { logger.warn(msg + ": " + ex); } } } if (this.destroyMethod != null) { invokeCustomDestroyMethod(this.destroyMethod); } else if (this.destroyMethodName != null) { Method methodToCall = determineDestroyMethod(); if (methodToCall != null) { invokeCustomDestroyMethod(methodToCall); } } }
大致过程
AbstractBeanFactory.getBean bean = InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() if(bean == null) 实例化 MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 初始化 BeanNameAware.setBeanName BeanClassLoaderAware.setBeanClassLoader BeanFactoryAware.setBeanFactory BeanPostProcessor.postProcessBeforeInitialization InitializingBean.afterPropertiesSet initMethod BeanPostProcessor.postProcessAfterInitialization -------------- AbstractApplicationContext.refresh BeanFactoryPostProcessor 扩展BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor registerBeanPostProcessors 注册 publishEvent(new ContextRefreshedEvent(this)); 扩展ApplicationListener -------------- AbstractApplicationContext.close publishEvent(new ContextClosedEvent(this)); DestructionAwareBeanPostProcessor.postProcessBeforeDestruction ((DisposableBean) bean).destroy(); destroyMethod