Fork me on GitHub
如果对您有帮助,麻烦您点赞留言吧~~~

Spring技术内幕:深入解析Spring架构与设计原理(第2版)【阅读笔记】

用着spring当然得懂核心技术以及原理啦~~~
话不多说,开干!不定期增加内容。

注:不是跟着书上的内容来的,完全是靠自己一个个方法点进去,分析实现原理
实际上,本文标题应该是 (Spring技术内幕:深入解析Spring架构与设计原理(第2版)【阅读笔记】 与 Spring源码分析)相结合
本文源码来自于spring4.1.3

spring 核心实现

什么是IoC

一个引用自https://www.zhihu.com/question/23277575的故事

我开了一家薯条店,底下有一百家分店
一开始我懒,让分店自己去炸薯条,反正只要他们按照统一的配方来就好,比如油温170度,炸两分钟
有一天我突然发现油温169度炸出来的薯条更好次,kao!我得打100个电话,告诉分店经理改配方!(就是你要改很多处代码)
有了这次教训,我觉得让总店(就是Spring容器)来统一炸好薯条,然后送到各个分店去,要吃的时候再拿出来炸热一下就ok了
本来是分店自己决定怎么炸薯条的,虽然我给了他们配方,但是最终决定权在他们手上,他们偷偷少炸几秒钟、少放点油,我都管不着,现在我霸道了,把炸薯条权收归中央,这不就是控制反转(IOC)了吗?
换个角度讲,现在分店的薯条,都是我总店炸好送过去的,分店依赖总店的薯条,这不就是依赖注入了吗?

IoC 容器系列的设计与实现

BeanFactory

BeanFactory是容器的最基本接口定义。

BeanFactory继承关系图

public interface BeanFactory {

	String FACTORY_BEAN_PREFIX = "&";
	
	// 获取指定名字的bean
	Object getBean(String name) throws BeansException;

	// 获取指定名字与类型的bean
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	// 获取指定类型的bean
	<T> T getBean(Class<T> requiredType) throws BeansException;

	// 获取指定名字的bean并覆盖bean的默认参数
	Object getBean(String name, Object... args) throws BeansException;

	// 获取指定类型的bean并覆盖bean的默认参数
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	// 判断IOC容器中是否有指定名字的bean
	boolean containsBean(String name);

	// 判断指定名字的bean是否为单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	// 判断指定名字的bean类型是否匹配
	boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

	// 获取指定名字的bean的类型
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	// 获取指定名字的bean的别名
	String[] getAliases(String name);

}

IOC容器的初始化过程

BeanDefinition的Resource定位

首先定义一个Resource来定位容器使用BeanDefinition。

常见几种读取方式

  • FileSystemXmlApplicationContext(从文件系统载入Resource)
    FileSystemXmlApplicationContext继承关系图

  • ClassPathXmlApplicationContext(从classpath载入Resource)

  • XmlWebApplicationContext(从web容器中载入Resource)

BeanDefinition的载入和解析
BeanDefinition在IoC容器中的注册

ApplicationContext

AbstractApplicationContext

refresh()

refresh方法的作用是加载spring容器

首先看一下refresh内部的执行过程


	public void refresh() throws BeansException, IllegalStateException {
        // 加上synchronized,防止出现竞态条件(初始化的过程中被销毁)
		synchronized (this.startupShutdownMonitor) {
			// 
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// 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);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

			catch (BeansException ex) {
				logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}
第一步:刷新beanFactory之前的初始化(prepareRefresh):

	protected void prepareRefresh() {
		// 获取启动容器时系统时间
		this.startupDate = System.currentTimeMillis();
		// 确定启动的标识,this.active是AtomicBoolean类型
		this.active.set(true);

		if (logger.isInfoEnabled()) {
			logger.info("Refreshing " + this);
		}

		// 初始化上下文环境,在AbstractApplicationContext中没有具体实现
		initPropertySources();

		// 验证必要的参数(initPropertySources方法初始化后的参数)是否完整
		getEnvironment().validateRequiredProperties();
	}
第二步:获取刷新后的beanFactory(obtainFreshBeanFactory)

	protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		
		// 刷新beanFactory,在AbstractApplicationContext中没有具体实现,具体实现在AbstractRefreshableApplicationContext与GenericApplicationContext中实现
		refreshBeanFactory();

		// 获取刷新后的beanFactory,在AbstractApplicationContext中没有具体实现,具体实现在AbstractRefreshableApplicationContext与GenericApplicationContext中实现
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	}
bean的载入过程(refreshBeanFactory),以AbstractRefreshableApplicationContext类为例

	protected final void refreshBeanFactory() throws BeansException {
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			// 载入
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}
loadBeanDefinitions载入、解析文件
  • XmlWebApplicationContext
    解析xml文件的各种标签、扫描包路径将有@Component注解的都注册到ioc容器中...
  • AnnotationConfigWebApplicationContext
  • GroovyWebApplicationContext
第三步:初始化刷新后的beanFactory(prepareBeanFactory)

	protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		
		// 设置类加载器
		beanFactory.setBeanClassLoader(getClassLoader());
		// 设置表达式解析器,比如解析SpEL表达式
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
		// 添加属性编辑器,比如某些特定格式的转换
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));


		// [详见BeanPostProcessor](#BeanPostProcessor),主要作用:修改bean对象(初始化之前和初始化之后)
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

		// 在AbstractAutowireCapableBeanFactory类中有具体实现,作用:忽略自动装配的接口(因为在bean初始化之前会调用ApplicationContextAwareProcessor.postProcessBeforeInitialization方法,就已经做了依赖处理)
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);

		// 注册依赖
		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);

		// 对Aspect的支持
		if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			// Set a temporary ClassLoader for type matching.
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}

		// 对系统变量进行注入
		if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
		}
		if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
		}
		if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
		}
	}
DefaultListableBeanFactory
BeanPostProcessor
AbstractAutowireCapableBeanFactory

PostProcessor 后置处理器

第四步:允许在bean加载完后,初始化前对beanFactory进行修改(postProcessBeanFactory),在其子类中实现自定义的需求

AbstractRefreshableWebApplicationContext类为例


	protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {

		beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
		beanFactory.ignoreDependencyInterface(ServletContextAware.class);
		beanFactory.ignoreDependencyInterface(ServletConfigAware.class);

		// 注册request/session作用域
		WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
		WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
	}

第五步:调用beanFactory的后置处理器(invokeBeanFactoryPostProcessors)

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		// 调用BeanFactory后置处理器
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
	}

	@Override
	public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor) {
		this.beanFactoryPostProcessors.add(beanFactoryPostProcessor);
	}

	public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
		return this.beanFactoryPostProcessors;
	}

详见PostProcessorRegistrationDelegate类中的部分方法


	/**
	 * beanFactoryPostProcessors,spring的扩展之一,查看springboot的加载过程时
	 * 会发现调用ApplicationContextInitializer.initialize
	 * 通过调用AbstractApplicationContext.addBeanFactoryPostProcessor,
	 * 将自定义的beanFactoryPostProcessor加入beanFactoryPostProcessors中
	 */
	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		Set<String> processedBeans = new HashSet<String>();

		// 首先处理BeanDefinitionRegistryPostProcessor
		// BeanDefinitionRegistryPostProcessor的作用是注册bean
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

			// 普通的后置处理器
			List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
			// 需要自定义注册bean的后置处理器(下文有解释)
			List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
					new LinkedList<BeanDefinitionRegistryPostProcessor>();

			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {

				// 判断是否为需要自定义注册bean的后置处理器
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryPostProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;

					// 调用自定义注册的方法
					// example: 
					//     在mybatis里
					//         MapperScannerConfigurer.java
					//           |-- postProcessBeanDefinitionRegistry
					//         会把dao的class(真实的class)改成"MapperFactoryBean.class",
					//         也就是所有的DAO都从MapperFactoryBean里获取,源码:ClassPathMapperScanner.java - line 171
					//         definition.setBeanClass(MapperFactoryBean.class);
					//     在dubbo里
					//         ServiceAnnotationBeanPostProcessor.java
					//           |-- postProcessBeanDefinitionRegistry
					//         解析package路径,注册bean
					registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
					registryPostProcessors.add(registryPostProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}
			}

			// 获取所有BeanDefinitionRegistryPostProcessor类型的后置处理器的名字
			// 详情见【spring源码解析-DefaultListableBeanFactory】
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

			// 1.选出实现了PriorityOrdered接口的bean(优先排序、调用)
			List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
			for (String ppName : postProcessorNames) {

				// 如果实现了PriorityOrdered接口
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			OrderComparator.sort(priorityOrderedPostProcessors);
			registryPostProcessors.addAll(priorityOrderedPostProcessors);

			// 注册bean到spring容器中
			invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);

			// 2.选出实现了Ordered接口的bean(优先排序、调用)
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
			for (String ppName : postProcessorNames) {

				// 如果实现了Ordered接口,因为PriorityOrdered继承Ordered,所以要把已经处理过的排除
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			OrderComparator.sort(orderedPostProcessors);
			registryPostProcessors.addAll(orderedPostProcessors);
			invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);

			// 接下来就是处理未经过排序的BeanDefinitionRegistryPostProcessor
			boolean reiterate = true;
			// 为什么要多一层while循环呢?
			// 因为在每次调用postProcessBeanDefinitionRegistry的时候,可能会增加bean
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
						registryPostProcessors.add(pp);
						processedBeans.add(ppName);
						pp.postProcessBeanDefinitionRegistry(registry);
						reiterate = true;
					}
				}
			}

			// 调用BeanFactory后置处理器,作用为【对BeanDefinition对象进行修改】
			invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// 调用BeanFactory后置处理器
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		// 获取所有实现了BeanFactoryPostProcessor类型的后置处理器的名字
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		List<String> orderedPostProcessorNames = new ArrayList<String>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
		for (String ppName : postProcessorNames) {

			// 如果当前bean name在已经处理的的名字列表中
			if (processedBeans.contains(ppName)) {
				// 在上面已经调用过后置处理器方法的就不用再处理
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 首先调用实现了PriorityOrdered接口的BeanFactoryPostProcessors
		OrderComparator.sort(priorityOrderedPostProcessors);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// 再调用实现了Ordered接口的BeanFactoryPostProcessors
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		OrderComparator.sort(orderedPostProcessors);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// 最后调用其他BeanFactoryPostProcessors
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
	}

	/**
	 * Invoke the given BeanFactoryPostProcessor beans.
	 */
	private static void invokeBeanFactoryPostProcessors(
			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

		for (BeanFactoryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanFactory(beanFactory);
		}
	}

BeanFactoryPostProcessor 与 BeanDefinitionRegistryPostProcessor的区别

首先看一下BeanFactoryPostProcessor的源码


public interface BeanFactoryPostProcessor {

	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

postProcessBeanFactory方法的作用在上文(第四步)也提到过,可以对beanFactory进行修改。

以下是BeanDefinitionRegistryPostProcessor的源码


public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

		void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,提供了postProcessBeanDefinitionRegistry方法,作用是可以根据自己的需求注册bean。

第六步:添加bean的后置处理器(registerBeanPostProcessors)

	protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
	}

详见PostProcessorRegistrationDelegate类中的部分方法


	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// Register BeanPostProcessorChecker that logs an info message when
		// a bean is created during BeanPostProcessor instantiation, i.e. when
		// a bean is not eligible for getting processed by all BeanPostProcessors.
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
		List<String> orderedPostProcessorNames = new ArrayList<String>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 跟上面注册BeanFactoryPostProcessor一样,先注册实现了PriorityOrdered接口的BeanPostProcessor
		OrderComparator.sort(priorityOrderedPostProcessors);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 注册实现了Ordered接口的BeanPostProcessor
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		OrderComparator.sort(orderedPostProcessors);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// 注册其他没有排序的BeanPostProcessor
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// Finally, re-register all internal BeanPostProcessors.
		OrderComparator.sort(internalPostProcessors);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

	/**
	 * Register the given BeanPostProcessor beans.
	 */
	private static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

		for (BeanPostProcessor postProcessor : postProcessors) {
			beanFactory.addBeanPostProcessor(postProcessor);
		}
	}
MergedBeanDefinitionPostProcessor

这个接口的作用是作为所有BeanPostProcessor加载完成之后的一个回调


	public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

		/**
		 * Post-process the given merged bean definition for the specified bean.
		 * @param beanDefinition the merged bean definition for the bean
		 * @param beanType the actual type of the managed bean instance
		 * @param beanName the name of the bean
		 */
		void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

	}
BeanPostProcessor 和 BeanFactoryPostProcessor的区别

BeanPostProcessor是针对于某个bean进行处理,BeanFactoryPostProcessor是针对于整个beanFactory(bean工厂)进行处理。

第七步:国际化支持(initMessageSource)
	protected void initMessageSource() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();

		// 如果存在messageSource,也就是说 用户 自定义过名字为messageSource的bean时
		// containsLocalBean和containsBean的区别,下面解释
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
			// Make MessageSource aware of parent MessageSource.
			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
				// 如果父级MessageSource为null,就设置,如果存在就不会再设置了
				if (hms.getParentMessageSource() == null) {
					// 设置父级MessageSource
					hms.setParentMessageSource(getInternalParentMessageSource());
				}
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Using MessageSource [" + this.messageSource + "]");
			}
		}
		else {
			// 默认设置为DelegatingMessageSource
			DelegatingMessageSource dms = new DelegatingMessageSource();
			dms.setParentMessageSource(getInternalParentMessageSource());
			this.messageSource = dms;
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isDebugEnabled()) {
				logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
						"': using default [" + this.messageSource + "]");
			}
		}
	}
containsLocalBeancontainsBean的区别

AbstractBeanFactory中的实现,可以看出containsLocalBean只是在当前beanFactory中查找bean,而containsBean还会在父级beanFactory中查找。

	public boolean containsLocalBean(String name) {
		String beanName = transformedBeanName(name);
		return ((containsSingleton(beanName) || containsBeanDefinition(beanName)) &&
				(!BeanFactoryUtils.isFactoryDereference(name) || isFactoryBean(beanName)));
	}

	public boolean containsBean(String name) {
		String beanName = transformedBeanName(name);
		if (containsSingleton(beanName) || containsBeanDefinition(beanName)) {
			return (!BeanFactoryUtils.isFactoryDereference(name) || isFactoryBean(name));
		}
		// Not found -> check parent.
		BeanFactory parentBeanFactory = getParentBeanFactory();
		return (parentBeanFactory != null && parentBeanFactory.containsBean(originalBeanName(name)));
	}
第八步:事件广播(initApplicationEventMulticaster)
	protected void initApplicationEventMulticaster() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		// 如果存在applicationEventMulticaster,也就是说 用户 自定义过名字为applicationEventMulticaster的bean时
		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
			this.applicationEventMulticaster =
					beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
			if (logger.isDebugEnabled()) {
				logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
			}
		}
		else {

			// 用户未自定义过,默认用SimpleApplicationEventMulticaster
			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
			beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
			if (logger.isDebugEnabled()) {
				logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
						APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
						"': using default [" + this.applicationEventMulticaster + "]");
			}
		}
	}
第九步:初始化特定上下文子类中的其他特殊bean(onRefresh)

默认没有实现

AbstractRefreshableWebApplicationContext类中的实现如下

	protected void onRefresh() {
		this.themeSource = UiApplicationContextUtils.initThemeSource(this);
	}

UiApplicationContextUtils类中的initThemeSource方法,
总而言之,onRefresh的具体作用就是初始化特定上下文子类中的其他特殊bean

	public static ThemeSource initThemeSource(ApplicationContext context) {
		if (context.containsLocalBean(THEME_SOURCE_BEAN_NAME)) {
			ThemeSource themeSource = context.getBean(THEME_SOURCE_BEAN_NAME, ThemeSource.class);
			// Make ThemeSource aware of parent ThemeSource.
			if (context.getParent() instanceof ThemeSource && themeSource instanceof HierarchicalThemeSource) {
				HierarchicalThemeSource hts = (HierarchicalThemeSource) themeSource;
				if (hts.getParentThemeSource() == null) {
					// Only set parent context as parent ThemeSource if no parent ThemeSource
					// registered already.
					hts.setParentThemeSource((ThemeSource) context.getParent());
				}
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Using ThemeSource [" + themeSource + "]");
			}
			return themeSource;
		}
		else {
			// Use default ThemeSource to be able to accept getTheme calls, either
			// delegating to parent context's default or to local ResourceBundleThemeSource.
			HierarchicalThemeSource themeSource = null;
			if (context.getParent() instanceof ThemeSource) {
				themeSource = new DelegatingThemeSource();
				themeSource.setParentThemeSource((ThemeSource) context.getParent());
			}
			else {
				themeSource = new ResourceBundleThemeSource();
			}
			if (logger.isDebugEnabled()) {
				logger.debug("Unable to locate ThemeSource with name '" + THEME_SOURCE_BEAN_NAME +
						"': using default [" + themeSource + "]");
			}
			return themeSource;
		}
	}
第十步:注册监听器(registerListeners)

applicationEventMulticaster在第八步中已经初始化过;

	protected void registerListeners() {
		// 在spring启动的过程中,会有部分监听器需要加载
		for (ApplicationListener<?> listener : getApplicationListeners()) {
			getApplicationEventMulticaster().addApplicationListener(listener);
		}
		
		// 获取实现ApplicationListener接口的bean(用户自定义的监听器)
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String lisName : listenerBeanNames) {
			getApplicationEventMulticaster().addApplicationListenerBean(lisName);
		}
	}

	ApplicationEventMulticaster getApplicationEventMulticaster() throws IllegalStateException {
		if (this.applicationEventMulticaster == null) {
			throw new IllegalStateException("ApplicationEventMulticaster not initialized - " +
					"call 'refresh' before multicasting events via the context: " + this);
		}
		return this.applicationEventMulticaster;
	}

spring会通过addApplicationListener加载监听器(非用户自定义的监听器)

	@Override
	public void addApplicationListener(ApplicationListener<?> listener) {
		if (this.applicationEventMulticaster != null) {
			this.applicationEventMulticaster.addApplicationListener(listener);
		}
		else {
			this.applicationListeners.add(listener);
		}
	}
第十一步:实例化剩余非懒加载的单例(finishBeanFactoryInitialization)
	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都是以beanDefinition的形式存在,类似于前端的虚拟DOM
		beanFactory.preInstantiateSingletons();
	}

DefaultListableBeanFactory中默认实现

	@Override
	public void freezeConfiguration() {
		this.configurationFrozen = true;
		this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
	}

	@Override
	public void preInstantiateSingletons() throws BeansException {
		if (this.logger.isDebugEnabled()) {
			this.logger.debug("Pre-instantiating singletons in " + this);
		}

		// 所有bean名字
		List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

		for (String beanName : beanNames) {

			// 获取合并后的RootBeanDefinition
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

			// bean不是抽象,是单例,不是懒加载
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

				// 判断是否实现了FactoryBean接口,下文付源码
				if (isFactoryBean(beanName)) {
					final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);

					// 是否强制实例化
					boolean isEagerInit;

					// 判断是否开启了安全校验,如果factoryBean实现了SmartFactoryBean
					// SmartFactoryBean:spring内部用,平时基本用不到
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
							@Override
							public Boolean run() {
								return ((SmartFactoryBean<?>) factory).isEagerInit();
							}
						}, getAccessControlContext());
					}
					else {

						// 如果没实现SmartFactoryBean,就直接为不需要强制实例化
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {

						// getBean目的也就是实例化
						getBean(beanName);
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged(new PrivilegedAction<Object>() {
						@Override
						public Object run() {
							smartSingleton.afterSingletonsInstantiated();
							return null;
						}
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

AbstractBeanFactory.isFactoryBean


	public boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException {

		// 获取bean的真实名字
		String beanName = transformedBeanName(name);

		// 获取bean对象
		Object beanInstance = getSingleton(beanName, false);

		// 不为null时,返回是否实现了FactoryBean
		if (beanInstance != null) {
			return (beanInstance instanceof FactoryBean);
		}
		// 在上面getSingleton里有加锁,所以到这一步之前,可能又被别的线程又注册了某些bean,所以这里还要判断一下是否被注册过
		else if (containsSingleton(beanName)) {
			
			// 如果已经注册,直接返回不是FactoryBean,在这里就可以看到,FactoryBean的作用就是增强Bean的能力
			return false;
		}

		// 如果在当前BeanFactory中没有发现,就去父BeanFactory找
		if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {
			
			return ((ConfigurableBeanFactory) getParentBeanFactory()).isFactoryBean(name);
		}

		// 上述条件都不满足,即:bean还未注册,也没有父级BeanFactory,那就去mdb里获取类型
		// getMergedLocalBeanDefinition在上面已经分析过,获取合并后的RootBeanDefinition
		return isFactoryBean(beanName, getMergedLocalBeanDefinition(beanName));
	}

	protected boolean isFactoryBean(String beanName, RootBeanDefinition mbd) {
		// 预测bean的类型
		Class<?> beanType = predictBeanType(beanName, mbd, FactoryBean.class);
		return (beanType != null && FactoryBean.class.isAssignableFrom(beanType));
	}

AbstractAutowireCapableBeanFactory.predictBeanType
AbstractAutowireCapableBeanFactory.determineTargetType

	protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {

		// 确定目标类型
		Class<?> targetType = determineTargetType(beanName, mbd, typesToMatch);

		if (targetType != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {

				// 如果有实现了SmartInstantiationAwareBeanPostProcessor的后置处理器
				// 就通过后置处理器来预测最终的类型
				if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
					SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;

					// 通过后置处理器来预测最终的类型
					Class<?> predicted = ibp.predictBeanType(targetType, beanName);

					// 这里的逻辑?有点懵
					if (predicted != null && (typesToMatch.length != 1 || !FactoryBean.class.equals(typesToMatch[0]) ||
							FactoryBean.class.isAssignableFrom(predicted))) {
						return predicted;
					}
				}
			}
		}
		return targetType;
	}

	protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
		
		// RootBeanDefinition中存储哪个类的信息
		Class<?> targetType = mbd.getTargetType();
		if (targetType == null) {

			/**
			 * 	// 通过beanAFactory中的getBeanA方法来获取
			 * 	<bean id="beanA" factory-bean="beanAFactory" factory-method="getBeanA">           
			 * 	</bean>
			 */
			// 如果bean有定义factory-method,从factoryMethod中获取类型
			// 否则就从RootBeanDefinition中获取beanClass,下文解析,内部还包含通过classLoader加载class
			targetType = (mbd.getFactoryMethodName() != null ? getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
					resolveBeanClass(mbd, beanName, typesToMatch));
			if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
				// 设置RootBeanDefinition中存储哪个类的信息
				mbd.setTargetType(targetType);
			}
		}
		return targetType;
	}

DefaultSingletonBeanRegistry.getSingleton
DefaultSingletonBeanRegistry.containsSingleton
DefaultSingletonBeanRegistry.beforeSingletonCreation

	protected Object getSingleton(String beanName, boolean allowEarlyReference) {

		// 获取这个bean
		Object singletonObject = this.singletonObjects.get(beanName);

		// 未获取到bean,而bean正在创建中时
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {

				// 从提前暴露的缓存中获取bean
				singletonObject = this.earlySingletonObjects.get(beanName);

				// 如果没有提前暴露 并且是允许提前引用(是否允许从singletonFactories中获取单例对象)
				// 注:上述allowEarlyReference传入的是false,所以不会进这里,singletonFactories也为空
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {

						// 从singletonFactory中获取单例对象
						singletonObject = singletonFactory.getObject();
						// 缓存在提前暴露的Map里(earlySingletonObjects)
						this.earlySingletonObjects.put(beanName, singletonObject);
						// 从singletonFactories中去除
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}

	public boolean containsSingleton(String beanName) {
		return this.singletonObjects.containsKey(beanName);
	}

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "'beanName' must not be null");
		synchronized (this.singletonObjects) {

			// 从缓存中取
			Object singletonObject = this.singletonObjects.get(beanName);

			// 如果缓存里没有
			if (singletonObject == null) {

				// 如果这个工厂处于销毁状态,就不用创建了,报错
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(beanName,
							"Singleton bean creation not allowed while the singletons of this factory are in destruction " +
							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
				}

				// 在创建前,先判断bean是否为不能加载的bean 和 bean是否在创建中
				beforeSingletonCreation(beanName);

				// 标识这个单例还没被创建
				boolean newSingleton = false;

				// suppressedExceptions 存放所有异常的Set集合
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);

				// 异常集合为空就初始化
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<Exception>();
				}
				try {
					// 这里才是执行创建bean的流程(createBean)
					singletonObject = singletonFactory.getObject();
					// 如果没有报异常 就标识创建成功
					newSingleton = true;
				}
				catch (IllegalStateException ex) {
					// Has the singleton object implicitly appeared in the meantime ->
					// if yes, proceed with it since the exception indicates that state.
					singletonObject = this.singletonObjects.get(beanName);
					if (singletonObject == null) {
						throw ex;
					}
				}
				catch (BeanCreationException ex) {
					if (recordSuppressedExceptions) {
						for (Exception suppressedException : this.suppressedExceptions) {
							ex.addRelatedCause(suppressedException);
						}
					}
					throw ex;
				}
				finally {
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}

					// 创建之后
					afterSingletonCreation(beanName);
				}

				// 创建成功
				if (newSingleton) {

					// 三级缓存的操作
					addSingleton(beanName, singletonObject);
				}
			}
			return (singletonObject != NULL_OBJECT ? singletonObject : null);
		}
	}

	protected void beforeSingletonCreation(String beanName) {

		// 在创建前,
		// 先判断bean是否为不能加载的bean
		// &&
		// 在正在创建的集合中添加beanName,添加成功,即:bean不在正在创建的集合中
		// 单例bean构造器参数循环依赖,会直接报错
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}

	protected void afterSingletonCreation(String beanName) {

		// 在创建后,
		// 还是要判断bean是否为不能加载的bean
		// &&
		// 在正在创建的集合中移除beanName,移除成功,即:bean在正在创建的集合中
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
			throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
		}
	}

	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			// 三级缓存的操作
			// 将这个单例对象放入单例对象集合中
			this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
			// 从单例工厂集合中移除
			this.singletonFactories.remove(beanName);
			// 从提前暴露的单例对象集合中移除
			this.earlySingletonObjects.remove(beanName);
			// 将beanName放入已经注册过的单例对象名称集合中
			this.registeredSingletons.add(beanName);
		}
	}

DefaultSingletonBeanRegistry.isSingletonCurrentlyInCreation

	public boolean isSingletonCurrentlyInCreation(String beanName) {
		return this.singletonsCurrentlyInCreation.contains(beanName);
	}

AbstractBeanFactory.getBean

	@Override
	public Object getBean(String name) throws BeansException {
		return doGetBean(name, null, null, false);
	}

	protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {

		// 转化为真实beanName
		final String beanName = transformedBeanName(name);
		Object bean;

		// 获取单例bean
		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类型可能是个FactoryBean
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			
			// 翻译:如果我们已经在创建这个bean实例,则失败:我们可以在循环引用中进行组合。
			// 从当前线程中获取正在创建的对象集合,判断beanName是否在这个集合里
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			// 从parentBeanFactory中查找是否存在
			BeanFactory parentBeanFactory = getParentBeanFactory();

			// 存在parentBeanFactory 并且 当前BeanFactory中没有beanName对应的BeanDefinition
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				
				// 无论name前面有多少个&,返回的beanName最多只有一个&
				// 源码下文
				String nameToLookup = originalBeanName(name);
				if (args != null) {

					// args有参数 => 使用显式参数委派到父级
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
					// args没参数 => 使用标准getBean方法
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}

			// -----------------------进入开始创建的流程-----------------------
			if (!typeCheckOnly) {

				// 标记这个bean
				// 源码
				/*
					protected void markBeanAsCreated(String beanName) {
						if (!this.alreadyCreated.contains(beanName)) {
							this.alreadyCreated.add(beanName);
						}
					}
				*/
				markBeanAsCreated(beanName);
			}

			try {

				// 获取合并后的RootBeanDefinition
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

				// 检查mdb是不是抽象类
				// 源码
				/*
					protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, Object[] args)
							throws BeanDefinitionStoreException {

						if (mbd.isAbstract()) {
							throw new BeanIsAbstractException(beanName);
						}
					}
				*/
				checkMergedBeanDefinition(mbd, beanName, args);

				// 获取所有依赖的beanName
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dependsOnBean : dependsOn) {
						if (isDependent(beanName, dependsOnBean)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dependsOnBean + "'");
						}
						// bean和依赖bean,互相关联,源码下文
						registerDependentBean(dependsOnBean, beanName);
						// 递归调用getBean(),目的是为了在实例化当前bean之前,把依赖的bean先加载
						getBean(dependsOnBean);
					}
				}

				// 创建bean实例
				// 单例的情况下
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							try {
								return createBean(beanName, mbd, args);
							}
							catch (BeansException ex) {
								// Explicitly remove instance from singleton cache: It might have been put there
								// eagerly by the creation process, to allow for circular reference resolution.
								// Also remove any beans that received a temporary reference to the bean.
								destroySingleton(beanName);
								throw ex;
							}
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}
				// 原型模式
				else if (mbd.isPrototype()) {
					// It's a prototype -> create a new instance.
					Object prototypeInstance = null;
					try {
						beforePrototypeCreation(beanName);
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
						afterPrototypeCreation(beanName);
					}
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}

				else {
					String scopeName = mbd.getScope();
					final Scope scope = this.scopes.get(scopeName);
					if (scope == null) {
						throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");
					}
					try {
						Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
							@Override
							public Object getObject() throws BeansException {
								beforePrototypeCreation(beanName);
								try {
									return createBean(beanName, mbd, args);
								}
								finally {
									afterPrototypeCreation(beanName);
								}
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new BeanCreationException(beanName,
								"Scope '" + scopeName + "' is not active for the current thread; " +
								"consider defining a scoped proxy for this bean if you intend to refer to it from a singleton",
								ex);
					}
				}
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		// Check if required type matches the type of the actual bean instance.
		if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {
			try {
				return getTypeConverter().convertIfNecessary(bean, requiredType);
			}
			catch (TypeMismatchException ex) {
				if (logger.isDebugEnabled()) {
					logger.debug("Failed to convert bean '" + name + "' to required type [" +
							ClassUtils.getQualifiedName(requiredType) + "]", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}

AbstractAutowireCapableBeanFactory.createBean

	protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {

		if (logger.isDebugEnabled()) {
			logger.debug("Creating instance of bean '" + beanName + "'");
		}
		// 通过classLoader加载beanClass
		resolveBeanClass(mbd, beanName);

		// 准备方法重写
		try {
			mbd.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(mbd.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}

		try {
			// 让BeanPostProcessors有机会返回代理而不是目标bean实例
			// Instantiation => 实例化
			// Initialization => 初始化
			// 顺序为
			// 实例化之前 => 实例化之后 => 初始化之前 => 初始化之后
			Object bean = resolveBeforeInstantiation(beanName, mbd);

			// 如果已经被后置处理器实例化过,就直接返回,不需要经过下面的doCreateBean来实例化对象
			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;
	}

AbstractBeanFactory.hasBeanClass
AbstractBeanFactory.resolveBeanClass


	public boolean hasBeanClass() {
		return (this.beanClass instanceof Class);
	}

	protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch)
			throws CannotLoadBeanClassException {
		try {

			// 从mbd中直接获取bean的类型
			// 有可能beanClass有值,但是beanClass instanceof Class为false,
			// 因为在这个classLoader里并没有加载这个class
			if (mbd.hasBeanClass()) {
				return mbd.getBeanClass();
			}

			// 如果还没加载这个class,那就要通过ClassLoader来加载

			// System.getSecurityManager()
			// 如果在程序里开启了权限检查:System.setSecurityManager(new SecurityManager())
			// 操作某些没有权限的文件时,会报错,所以要通过AccessController.doPrivileged,来执行
			// 即:越权操作
			if (System.getSecurityManager() != null) {
				return AccessController.doPrivileged(new PrivilegedExceptionAction<Class<?>>() {
					@Override
					public Class<?> run() throws Exception {

						// 解析bean的类型
						return doResolveBeanClass(mbd, typesToMatch);
					}
				}, getAccessControlContext());
			}
			else {
				return doResolveBeanClass(mbd, typesToMatch);
			}
		}
		catch (PrivilegedActionException pae) {
			ClassNotFoundException ex = (ClassNotFoundException) pae.getException();
			throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
		}
		catch (ClassNotFoundException ex) {
			throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
		}
		catch (LinkageError err) {
			throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), err);
		}
	}

	private Class<?> doResolveBeanClass(RootBeanDefinition mbd, Class<?>... typesToMatch) throws ClassNotFoundException {
		if (!ObjectUtils.isEmpty(typesToMatch)) {
			ClassLoader tempClassLoader = getTempClassLoader();
			if (tempClassLoader != null) {

				// 如果tempClassLoader是DecoratingClassLoader类型,就把所有要匹配的类型(typesToMatch)添加到tempClassLoader
				// DecoratingClassLoader的作用:使这些类不被自定义的classLoader管理,即:使用jdk默认加载机制
				if (tempClassLoader instanceof DecoratingClassLoader) {
					DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader;
					for (Class<?> typeToMatch : typesToMatch) {
						dcl.excludeClass(typeToMatch.getName());
					}
				}
				String className = mbd.getBeanClassName();
				return (className != null ? ClassUtils.forName(className, tempClassLoader) : null);
			}
		}

		// 这里涉及到类加载
		return mbd.resolveBeanClass(getBeanClassLoader());
	}

AbstractBeanDefinition.resolveBeanClass
AbstractBeanDefinition.prepareMethodOverrides

	public Class<?> resolveBeanClass(ClassLoader classLoader) throws ClassNotFoundException {
		String className = getBeanClassName();
		if (className == null) {
			return null;
		}
		// 从classLoader中加载class
		Class<?> resolvedClass = ClassUtils.forName(className, classLoader);
		this.beanClass = resolvedClass;
		return resolvedClass;
	}

	public void prepareMethodOverrides() throws BeanDefinitionValidationException {
		// 获取methodOverrides
		MethodOverrides methodOverrides = getMethodOverrides();

		// 如果不为空,就准备重写
		if (!methodOverrides.isEmpty()) {
			for (MethodOverride mo : methodOverrides.getOverrides()) {
				prepareMethodOverride(mo);
			}
		}
	}

	protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException {

		// 获取这个类中有几个方法名
		int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());

		// 如果为0,说明没有方法可以重写
		if (count == 0) {
			throw new BeanDefinitionValidationException(
					"Invalid method override: no method with name '" + mo.getMethodName() +
					"' on class [" + getBeanClassName() + "]");
		}
		// 如果为1,设置标识为false,即表示还没有重写
		else if (count == 1) {
			// Mark override as not overloaded, to avoid the overhead of arg type checking.
			mo.setOverloaded(false);
		}

		// 如果大于1,就不知道重写哪个方法了
	}

AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation

	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		// 实例化之前判断是否已经被后置处理器实例化过
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {

			// 如果还没实例化,就通过调用自定义的后置处理器来获取对象
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
					// 调用自定义的beanPostProcessorsBeforeInstantiation实例化之前的处理
					// 可以返回代理对象
					// 如果在实例化之前调用自定义的后置处理器,有返回实例化对象的时候,就直接返回这个对象
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

					// 如果获取到代理对象
					// 则调用beanPostProcessorsAfterInitialization来操作初始化之后的处理
					if (bean != null) {
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				}
			}
			// 是否在实例化前被后置处理器实例化过
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}

	// 实例化前
	protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName)
			throws BeansException {

		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

				// 如果在实例化之前调用自定义的后置处理器,有返回实例化对象的时候,就直接返回这个对象
				// 额..听起来比较拗口
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
					return result;
				}
			}
		}
		return null;
	}

	// 初始化后的操作
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
			result = beanProcessor.postProcessAfterInitialization(result, beanName);
			if (result == null) {
				return result;
			}
		}
		return result;
	}

	// !!!!这里才是创建bean对象的实现!!!!
	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
		// 实例化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);
				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<Object>() {
				@Override
				public Object getObject() throws BeansException {
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
			populateBean(beanName, mbd, instanceWrapper);
			if (exposedObject != null) {
				exposedObject = initializeBean(beanName, exposedObject, mbd);
			}
		}
		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);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

AbstractBeanFactory.isPrototypeCurrentlyInCreation

	protected boolean isPrototypeCurrentlyInCreation(String beanName) {

		// prototypesCurrentlyInCreation是ThreadLocal
		// 从当前线程中获取正在创建的对象集合,判断beanName是否在这个集合里
		Object curVal = this.prototypesCurrentlyInCreation.get();
		return (curVal != null &&
				(curVal.equals(beanName) || (curVal instanceof Set && ((Set<?>) curVal).contains(beanName))));
	}

AbstractBeanFactory.getObjectForBeanInstance

	protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {

		/*
			if(a && b) {}
			if(b || a) {}
			如果A满足,B满足,再B满足
			如果A满足,B不满足,再B不满足,A满足
			如果A不满足,再B满足,
			如果A不满足,再B不满足,A不满足

			对比

			if(a && b) {}
			if(a || b) {}
			如果A满足,B满足,再A满足
			如果A满足,B不满足,再A满足
			如果A不满足,再A不满足,B是否满足

			他这个反着的写法优势在哪里???
		*/

		// 如果要获取的bean是FactoryBean对象(name是&开头),但是又没有实现FactoryBean,则报错
		// public static boolean isFactoryDereference(String name) {
		//	return (name != null && name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
		//}
		if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {

			throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
		}

		// 如果bean没有实现FactoryBean接口 或者 获取的bean是FactoryBean对象(name是&开头),直接返回,因为他并没有实现FactoryBean
		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
			return beanInstance;
		}

		Object object = null;

		if (mbd == null) {

			// 从缓存(factoryBeanObjectCache)里获取实例
			object = getCachedObjectForFactoryBean(beanName);
		}

		if (object == null) {
			
			// 如果缓存中没有,就从FactoryBean中获取,并缓存
			FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
			if (mbd == null && containsBeanDefinition(beanName)) {
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}

FactoryBeanRegistrySupport.getCachedObjectForFactoryBean

	protected Object getCachedObjectForFactoryBean(String beanName) {
		Object object = this.factoryBeanObjectCache.get(beanName);
		return (object != NULL_OBJECT ? object : null);
	}

FactoryBeanRegistrySupport.getObjectFromFactoryBean

	protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {

		// 如果FactoryBean是单例 并且 singletonObjects中包含这个bean
		if (factory.isSingleton() && containsSingleton(beanName)) {
			synchronized (getSingletonMutex()) {

				// 从缓存中查找
				Object object = this.factoryBeanObjectCache.get(beanName);
				if (object == null) {

					// 这里才是去FactoryBean里获取对象
					object = doGetObjectFromFactoryBean(factory, beanName);
					
					// 注释翻译:
					// 在上面的getObject()调用中,只有在还没有放置的情况下才进行后期处理和存储(例如,由于自定义getBean调用触发了循环引用处理)
					// 就是说,上面FactoryBean.getObject()里是自定义的,并不知道有没有缓存过,所以在这里再获取一遍,如果没有缓存过,那就进行缓存
					Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
					if (alreadyThere != null) {
						object = alreadyThere;
					}
					else {

						// 如果shouldPostProcess为true,就需要执行后置处理器(postProcessAfterInitialization)
						// 源码下文
						if (object != null && shouldPostProcess) {
							try {
								object = postProcessObjectFromFactoryBean(object, beanName);
							}
							catch (Throwable ex) {
								throw new BeanCreationException(beanName,
										"Post-processing of FactoryBean's singleton object failed", ex);
							}
						}
						// 放入缓存
						this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
					}
				}
				return (object != NULL_OBJECT ? object : null);
			}
		}
		else {
			// 不是单例就不用放到缓存,直接从FactoryBean中获取
			Object object = doGetObjectFromFactoryBean(factory, beanName);
			if (object != null && shouldPostProcess) {
				try {
					object = postProcessObjectFromFactoryBean(object, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
				}
			}
			return object;
		}
	}

FactoryBeanRegistrySupport.doGetObjectFromFactoryBean

	private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
			throws BeanCreationException {

		Object object;
		try {
			if (System.getSecurityManager() != null) {
				AccessControlContext acc = getAccessControlContext();
				try {
					object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
						@Override
						public Object run() throws Exception {

								// 通过getObject()获取对象
								return factory.getObject();
							}
						}, acc);
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				object = factory.getObject();
			}
		}
		catch (FactoryBeanNotInitializedException ex) {
			throw new BeanCurrentlyInCreationException(beanName, ex.toString());
		}
		catch (Throwable ex) {
			throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
		}

		
		// 如果bean还在创建中,就返回null
		if (object == null && isSingletonCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(
					beanName, "FactoryBean which is currently in creation returned null from getObject");
		}
		return object;
	}

AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean
AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization

	@Override
	protected Object postProcessObjectFromFactoryBean(Object object, String beanName) {
		return applyBeanPostProcessorsAfterInitialization(object, beanName);
	}

	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {

			// 每次执行完后置处理器,就返回修改后的结果,如果把bean设置为null,那也就直接返回null
			result = beanProcessor.postProcessAfterInitialization(result, beanName);
			if (result == null) {
				return result;
			}
		}
		return result;
	}

DefaultSingletonBeanRegistry.registerDependentBean


	public void registerDependentBean(String beanName, String dependentBeanName) {
		// 获取真实beanName
		String canonicalName = canonicalName(beanName);

		// key => beanName
		// value => beanName依赖的dependentBeanName的集合
		Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);

		// 如果依赖的dependentBeanName已经在这个集合里了,就结束
		if (dependentBeans != null && dependentBeans.contains(dependentBeanName)) {
			return;
		}

		// 如果没有在集合里
		// key => beanName
		// value => beanName依赖的dependentBeanName的集合
		synchronized (this.dependentBeanMap) {

			dependentBeans = this.dependentBeanMap.get(canonicalName);
			// 集合为null,先初始化集合
			if (dependentBeans == null) {
				dependentBeans = new LinkedHashSet<String>(8);
				this.dependentBeanMap.put(canonicalName, dependentBeans);
			}

			// 把依赖的dependentBeanName对应起来
			dependentBeans.add(dependentBeanName);
		}

		// key => dependentBeanName
		// value => 所有依赖dependentBeanName的beanName(真实beanName)集合
		// 与上面这个相反:
		// 上面这个是beanName对应所有依赖beanName
		// 下面这个是依赖beanName对应所有beanName
		synchronized (this.dependenciesForBeanMap) {

			Set<String> dependenciesForBean = this.dependenciesForBeanMap.get(dependentBeanName);
			if (dependenciesForBean == null) {
				dependenciesForBean = new LinkedHashSet<String>(8);
				this.dependenciesForBeanMap.put(dependentBeanName, dependenciesForBean);
			}
			dependenciesForBean.add(canonicalName);
		}
	}

BeanFactory与FactoryBean的区别

AbstractBeanFactory类中的部分方法
	protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
		// 根据bean名字获取合并过的beanDefinition
		RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
		// 如果已经合并过,直接返回合并后的
		if (mbd != null) {
			return mbd;
		}
		// 合并beanDefinition
		return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
	}

	protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd)
			throws BeanDefinitionStoreException {

		return getMergedBeanDefinition(beanName, bd, null);
	}

	protected RootBeanDefinition getMergedBeanDefinition(
			String beanName, BeanDefinition bd, BeanDefinition containingBd)
			throws BeanDefinitionStoreException {

		// 加锁进行合并操作
		synchronized (this.mergedBeanDefinitions) {
			RootBeanDefinition mbd = null;

			// Check with full lock now in order to enforce the same merged instance.
			if (containingBd == null) {
				mbd = this.mergedBeanDefinitions.get(beanName);
			}

			if (mbd == null) {

				// 如果没有父类,即没有配置parent
				if (bd.getParentName() == null) {

					// BeanDefinition转成RootBeanDefinition
					if (bd instanceof RootBeanDefinition) {
						mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
					}
					else {
						mbd = new RootBeanDefinition(bd);
					}
				}
				else {
					// 要将子类合并到父类
					BeanDefinition pbd;
					try {

						// transformedBeanName的目的是获取bean的真实名字,这里获取的是bean的parent name,详情见下文
						String parentBeanName = transformedBeanName(bd.getParentName());

						// bean name 和 parent name不同时,递归合并parent, parent.parent。。。。
						if (!beanName.equals(parentBeanName)) {
							pbd = getMergedBeanDefinition(parentBeanName);
						}
						else {

							// 疑问:我好像没发现有parentBeanFactory??
							if (getParentBeanFactory() instanceof ConfigurableBeanFactory) {
								pbd = ((ConfigurableBeanFactory) getParentBeanFactory()).getMergedBeanDefinition(parentBeanName);
							}
							else {
								throw new NoSuchBeanDefinitionException(bd.getParentName(),
										"Parent name '" + bd.getParentName() + "' is equal to bean name '" + beanName +
										"': cannot be resolved without an AbstractBeanFactory parent");
							}
						}
					}
					catch (NoSuchBeanDefinitionException ex) {
						throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
								"Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);
					}
					
					// 将parentBeanDefinition作为RootBeanDefinition,把属性深度覆盖
					mbd = new RootBeanDefinition(pbd);

					// 覆盖属性的方法,源码没列出来
					mbd.overrideFrom(bd);
				}

				// 默认为单例bean
				if (!StringUtils.hasLength(mbd.getScope())) {
					mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON);
				}

				if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
					mbd.setScope(containingBd.getScope());
				}

				if (containingBd == null && isCacheBeanMetadata() && isBeanEligibleForMetadataCaching(beanName)) {
					this.mergedBeanDefinitions.put(beanName, mbd);
				}
			}

			return mbd;
		}
	}
	protected String transformedBeanName(String name) {
		return canonicalName(BeanFactoryUtils.transformedBeanName(name));
	}

	// BeanFactoryUtils.transformedBeanName的源码
	public static String transformedBeanName(String name) {
		Assert.notNull(name, "'name' must not be null");
		String beanName = name;

		// 判断bean是否为"&"开头
		while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
			beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
		}

		// 返回去除&的名字,而这个名字不一定是真实的bean name,有可能是别名
		return beanName;
	}

	// SimpleAliasRegistry.canonicalName的源码
	// 获取真实的beanName
	public String canonicalName(String name) {
		String canonicalName = name;
		
		String resolvedName;

		// 无限取,直到取到真实的bean name,
		// 可能a的别名是b,b的别名是c
		do {
			resolvedName = this.aliasMap.get(canonicalName);
			if (resolvedName != null) {
				canonicalName = resolvedName;
			}
		}
		while (resolvedName != null);

		// 直到别名map中没有对应的值时,才返回这个bean name(真实的bean name)
		return canonicalName;
	}

	// 无论name前面有多少个&,返回的beanName最多只有一个&
	protected String originalBeanName(String name) {
		String beanName = transformedBeanName(name);
		if (name.startsWith(FACTORY_BEAN_PREFIX)) {
			beanName = FACTORY_BEAN_PREFIX + beanName;
		}
		return beanName;
	}

等待后文 (上次更新时间:2019/12/11)- line 1614

...
...
...
...
...
...
...
...
...
...
...
...
...
等待后文...

posted @ 2018-08-27 14:10  jarjune  阅读(6570)  评论(4编辑  收藏  举报