spring笔记6 容器加载过程、bean初始化

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


猜你喜欢

转载自blog.csdn.net/u013038630/article/details/76643280