全网最硬核的源码分析之——Spring Ioc源码

301 阅读39分钟

创建spring 应用上下文

new AnnotationConfigApplicationContext(AsyncConfig.class);

使用AnnotationConfigApplicationContext创建bean

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		// 调用本类的构造函数,创建默认的Bean工厂DefaultListableBeanFactory
		// 		初始化内置的一些后置处理器【包括:用来解析常用注解@Resource,@Autowired,@Configuration等注解的后置处理器】

		// 初始化Spring容器所需的环境信息对象Environment及资源加载器对象ResourceLoader,还会初始化配置文件解析器
		this();

		// 解析配置类并将配置类封装为一个bean定义注册到Bean定义注册中心
		register(componentClasses);

		// 执行刷新的容器操作
		refresh();
	}

public AnnotationConfigApplicationContext() {
		/** 1.使用父类GenericApplicationContext创建默认的Bean工厂: DefaultListableBeanFactory */

		/**
		 * 2.初始化默认的Bean定义读取器,该步骤也会给容器中注册用来处理Spring注解的后置处理器.
		 *   创建conditionEvaluator, 初始化用于处理条件注解的对象,
		 *
		 * 该步骤中会向容器中注入以下几个比较重要的后置处理器:
		 * 	(1) ConfigurationClassPostProcessor(本质是一个BeanFactoryPostProcessor): 用来处理JavaConfig配置类的后置处理器,包括JavaConfig配置类中注解的解析及处理操作
		 * 	(2) AutowiredAnnotationBeanPostProcessor: 用来处理@Autowired@Value注解
		 * 	(3) CommonAnnotationBeanPostProcessor: 提供对JSR-250规范注解的支持@javax.annotation.Resource、
		 * 	    @javax.annotation.PostConstruct 和 @javax.annotation.PreDestroy等的支持。
		 * 	(4) EventListenerMethodProcessor:提供对@PersistenceContext的支持
		 * 	(5) DefaultEventListenerFactory: 提供对@EventListener的支持
		 */
		this.reader = new AnnotatedBeanDefinitionReader(this);

		/**
		 * 3.初始化默认的Bean定义扫描器,在ClassPathBeanDefinitionScanner的构造中,会初始化配置文件解析器
		 *
		 *  初始化CandidateComponentsIndexLoader对象,用来按照索引加载bean定义
		 */
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}


<T> void doRegisterBean(Class<T> beanClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
			@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {

		// 实例化注解格式的Bean定义。其中包括设置bean的类型以及初始化用于获取类注解信息的元数据对象
		AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
		/**
		 * 根据类上面的注解元数据信息,判断注册过程是否需要跳过当前的bean,如果配置类上面未标注@Conditional注解,会返回false。不会跳过
		 *
		 * conditionEvaluator默认实现类为ConditionEvaluator
		 *
		 * abd.getMetadata获取到的MedataData类型为 StandardAnnotationMetaData
		*/
		// 如果当前配置类上没有标注@Conditional注解,返回false
		if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
			return;
		}

		/***
		// 1.supplier 使用:
		Supplier<Integer> supplier = new Supplier<Integer>() {
			@Override
			public Integer get() {
				return new Random().nextInt();
			}
		};
		Integer result = supplier.get();

		// 2. lambda表达式形式
		supplier = () -> new Random().nextInt();
		result = supplier.get();
		*/

		// 给Bean定义中注册回调supplier回调方法
		abd.setInstanceSupplier(instanceSupplier);

		// 默认实现类为:AnnotationScopeMetadataResolver,解析@Scope注解的元信息
		ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);

		// 设置bean的作用域,未设置默认为'singleton'
		abd.setScope(scopeMetadata.getScopeName());

		// 获取Bean的名称。如果传入的name为null。则使用默认的Bean Name生成器AnnotationBeanNameGenerator生成bean的名称.根据内省操作获取的bean名称.
		String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

		// 解析公共注解上面的元数据信息 例如:@DependsOn, @Lazy,@Primary,@DependsOn,@Description
		AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);

		// 如果使用new AnnotationConfigApplicationContext(Class<?> clazz)创建的bean容器,
		//    则此处的qualifiers和下面的definitionCustomizers都默认为null
		if (qualifiers != null) {
			for (Class<? extends Annotation> qualifier : qualifiers) {
				if (Primary.class == qualifier) {
					abd.setPrimary(true);
				}
				else if (Lazy.class == qualifier) {
					abd.setLazyInit(true);
				}
				else {
					abd.addQualifier(new AutowireCandidateQualifier(qualifier));
				}
			}
		}
		for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
			customizer.customize(abd);
		}

		// 用来保存Bean的定义。包括bean的名称,定义及别名信息
		BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);

		// 设置bean定义的作用域模式,如果为ScopedProxyMode.NO,直接返回.
		definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);

		// 真正完成配置类bean定义的注册。将bean定义注册到bean定义注册中心,即:BeanDefinitionRegistry中
		// this.registry即AnnotationConfigApplicationContext对象
		BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
	}

refresh方法

执行刷新的容器操作 -核心代码

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			/**
			 * 1.准备上下文的刷新工作,记录bean容器的启动时间,容器活跃状态
			 *    验证系统中一些属性和属性值的设置等.
			 *    使用LinkedHashSet初始化earlyApplicationListeners和earlyApplicationEvents
			 */
			prepareRefresh();
			/**
			 * 2.获取Bean工厂,期间会做解析和加载bean定义的一系列工作.生成BeanDefinition对象.
			 * 此处返回的beanFactory的真实类型为:DefaultListableBeanFactory
			 *
			 */
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
			/**
			 * 3.bean工厂的初始化准备工作,设置bean工厂的一些属性
			 * 比如:创建bean工厂时,需要忽略哪些接口,需要注册哪些bean,需要设置哪些Bean的后置处理器等.
			 *
			 * 例如常用的:ApplicationContextAwareBeanPostProcessor, ApplicationListenerDetector
			 *
			 * 此外,注册一些和环境相关的bean单实例bean.
			 */
			prepareBeanFactory(beanFactory);

			try {
				/**
				 * 4.Bean定义加载完毕之后实现,目前方法为空实现,留给开发人员进行自定义扩展。
				 *
				 * 该方法在Bean定义加载完毕之后,Bean实例化之前会执行
				 * 比如在BeanFactory加载完所有的Bean定义之后,想要修改某个bean的定义信息,可以通过重写这个方法实现.
				 */
				postProcessBeanFactory(beanFactory);

				/**
				 * 5.执行beanFactory的后置处理器
				 *BeanFactoryPostProcessor:
				 * 功能: 允许我们在 Spring 容器实例化任何 bean 之前读取 bean 的定义 (BeanDefinition) 并进行修改。
				 * 作用时机: 在所有的 bean 定义都被加载、但 bean 实例还未创建的时候执行。
				 * 常见应用: 修改已加载到容器中的 bean 定义的属性,例如更改某个 bean 的作用域、属性值等。
				  * BeanDefinitionRegistryPostProcessor:
				 * 功能: 扩展了 BeanFactoryPostProcessor,提供了一个新的方法来修改应用程序的上下文的 bean 定义。此外,还可以动态注册新的 bean 定义。
				 * 作用时机: 它也是在所有 bean 定义被加载后执行,但在 BeanFactoryPostProcessor 之前。
				 * 常见应用: 动态注册新的 bean 定义、修改或移除已有的 bean 定义。
				 *
				 * 先执行BeanDefinitionRegistryPostProcessor接口的实现类的postProcessBeanDefinitionRegistry方法,
				 *   执行过程中,也是先执行实现了优先级接口PriorityOrdered的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
				 *   然后执行实现了Ordered接口的...
				 *   最后执行未实现PriorityOrdered接口和Ordered接口的...
				 *
				 * 然后执行BeanFactoryPostProcessor接口的实现类的postProcessBeanFactory方法
				 *   执行过程中,也是先执行实现了优先级接口PriorityOrdered的BeanFactoryPostProcessor的postProcessBeanFactory方法
				 *   然后执行实现了Ordered接口的...
				 *   最后执行未实现PriorityOrdered接口和Ordered接口的...
				 *
				 *   其中也涉及到了排序过程
				 *
				 *
				 *  配置类中的Selector类型的组件和@Component,@ComponentScan中的元数据信息也会在该步骤中进行解析
				 *    还包括执行条件注解@Condition的回调逻辑
				 *
				 *
				 *  ImportBeanDefinitionRegistrar对应的registerBeanDefinitions方法也会在该步骤中调用,给容器中注册自定义的组件.
				 */
				invokeBeanFactoryPostProcessors(beanFactory);

			

				/**
				 * 6.注册所有bean的后置处理器.用来拦截Bean的创建
				 *
				 * 注册所有实现了BeanPostProcessor接口的后置处理器
				 *   执行过程中,也是先执行实现了优先级接口PriorityOrdered接口的BeanPostProcessor的addBeanPostProcessor方法
				 *   然后执行实现了Ordered接口的...
				 *   最后执行未实现PriorityOrdered接口和Ordered接口的...
				 *
				 *   其中也涉及到了排序过程
				 */
				registerBeanPostProcessors(beanFactory);

				/**
				 * 7.初始化消息源
				 * 用来做国际化,消息绑定,消息解析等功能
				 * 一般在SpringMVC中会使用到.
				 */
				initMessageSource();

				/**
				 * 8.初始化事件派发器,用来发布事件
				 * 	如果容器中有类型为ApplicationEventMulticaster的派发器组件,则直接获取使用
				 * 	如果容器中没有,则默认创建一个类型为SimpleApplicationEventMulticaster的派发器,供容器派发事件使用
				 */
				initApplicationEventMulticaster();

				/**
				 * 9.用来初始化一些特殊的Bean,目前默认是空方法,未实现,可以通过继承AbstractApplicationContext类,
				 *   然后覆写该方法进行自定义特殊bean的初始化.
				 *
				 * 比如:AbstractRefreshableWebApplicationContext中onRefresh方法用来初始化主题能力.
				 *
				 * SpringBoot在该步骤中启动内嵌Tomcat容器的
                 * 
				 */
				onRefresh();

				/**
				 * 10.注册监听器
				 * 将监听器绑定到广播器上,将监听器对应的beanName绑定到到第8步初始化的事件派发器中,
				 *   如果之前有发布的事件,则直接通过事件派发器将事件派发出去.
				 */
				registerListeners();

				/**
				 * 11.初始化所有剩余的单实例Bean(没有使用懒加载的Bean).整个Spring IOC的核心.
				 *
				 * 包括执行@PostConstruct标注的方法.
				 *
				 * 注意:SpringMVC的父子容器创建Bean的过程:
				 *   SpringMVC中,存在着父容器和子容器。当父容器启动之后,会通过该方法将所有的Dao和Service对应的Bean创建出来,保存到beanFactory的单例缓存容器中
				 *   当子容器启动之后,也会通过该方法将所有的Controller,viewResolver,HandlerMapping对应的Bean创建出来,然后放入到beanFactory的单例缓存容器中.
				 */
				finishBeanFactoryInitialization(beanFactory);

				/** 12.发布事件。例如容器中的刷新事件:ContextRefreshedEvent就是在这一步中发布. SpringCloud在该步骤中会启动web服务 */
				finishRefresh();
			}
			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}
				// Destroy already created singletons to avoid dangling resources.
				// 清空单实例bean对应的map及缓存
				destroyBeans();

				// 设置容器的活跃状态为false
				cancelRefresh(ex);
				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

prepareRefresh-准备上下文的刷新工作

protected void prepareRefresh() {
		// 记录容器的启动时间.
		this.startupDate = System.currentTimeMillis();
		// 记录容器未关闭
		this.closed.set(false);
		// 记录容器状态为激活状态
		this.active.set(true);

		if (logger.isDebugEnabled()) {
			if (logger.isTraceEnabled()) {
				logger.trace("Refreshing " + this);
			}
			else {
				logger.debug("Refreshing " + getDisplayName());
			}
		}

		// Initialize any placeholder property sources in the context environment.
		/**
		 * 如果需要在验证系统属性之前,给系统中设置一些默认值。可以通过继承AbstractApplicationContext类,并重写该方法实现。
		 * Spring留给开发人员的一个扩展点.
		 *
		 * 例如子类在方法中设置环境属性中必须需要的变量:getEnvironment().setRequiredProperties("myProp");
		 */
		initPropertySources();

		// Validate that all properties marked as required are resolvable:
		// see ConfigurablePropertyResolver#setRequiredProperties
		/**
		 * 作用:校验设置的必须属性是否能够在系统环境中找到对应的值
		 *
		 * 如果在initPropertySources方法中使用getEnvironment().setRequiredProperties(String... keys)设置了必须的属性,而通过this.getProperty(key)
		 * 没有从系统环境中获取到属性的值,则会抛出MissingRequiredPropertiesException异常
		 */
		getEnvironment().validateRequiredProperties();

		// Store pre-refresh ApplicationListeners...
		if (this.earlyApplicationListeners == null) {
			/** 在SpringBoot中会有大量的初始化监听器,用于初始化使用 */
			this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
		}
		else {
			// Reset local application listeners to pre-refresh state.
			this.applicationListeners.clear();
			this.applicationListeners.addAll(this.earlyApplicationListeners);
		}

		// Allow for the collection of early ApplicationEvents,
		// to be published once the multicaster is available...
		/** 定义早期的应用事件 */
		this.earlyApplicationEvents = new LinkedHashSet<>();
	}

obtainFreshBeanFactory-获取Bean工厂,期间会做解析和加载bean定义的一系列工作


protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		/**
		 * 刷新bean工厂,判断bean工厂是否已经存在,如果存在需要进行销毁和关闭
		 *  默认调用的是AbstractRefreshableApplicationContext的refreshBeanFactory方法.
		 *  刷新Bean工厂时会进行bean定义的加载操作。
		 */
		refreshBeanFactory();
		// 这个方法是本类中定义的一个抽象方法,是一个模板方法,具体的实现在子类中
		return getBeanFactory();
	}

protected final void refreshBeanFactory() throws BeansException {
		// 判断bean工厂是否存在,如果存在需要先销毁和关闭。否则会出现问题
		if (hasBeanFactory()) {
			// 销毁bean,根据bean的名称将bean工厂中的所有bean都从map中移除
			destroyBeans();
			// 关闭bean工厂,设置Bean工厂的序列化id为null,并将beanFactory的值赋值为null
			closeBeanFactory();
		}
		try {
			// 重新创建bean工厂,默认返回的是Bean工厂类型是:DefaultListableBeanFactory
			DefaultListableBeanFactory beanFactory = createBeanFactory();

			// 设置序列化ID,ID: class名称 + "@" + 对象的十六进制值
			beanFactory.setSerializationId(getId());

			// 定制bean工厂。作用:设置bean定义是否可以被覆盖以及设置bean在创建的时候是否允许循环引用.
			customizeBeanFactory(beanFactory);

			// 解析并加载bean的定义,默认是通过AbstractXmlApplicationContext类中的loadBeanDefinitions实现
			loadBeanDefinitions(beanFactory);

			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

prepareBeanFactory--bean工厂的初始化准备工作,设置bean工厂的一些属性

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		// Tell the internal bean factory to use the context's class loader etc.
		beanFactory.setBeanClassLoader(getClassLoader());

		// 设置SPEL表达式解析器,用来支持Spring的SPEL表达式
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));

		// 添加属性编辑注册器。例如一个字符串类型的地址需要转换为一个Address对象,可以使用该功能.
		// 可参考示例:spring-source-study模块下的com.wb.spring.propertyeditor包下的示例程序
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

		// 添加bean的后置处理器。此处添加的是Spring自己的后置处理器,用来回调bean所实现的aware接口中的方法.
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

		// 下面的ignoreDependencyInterface是用来设置bean工厂中需要忽略的接口
		// 可以通过实现EnvironmentAware接口来获取到当前的环境信息Environment。
		/**
		 * 如果将EnvironmentAware接口添加到ignoreDependencyInterface中,则在使用的地方通过@Autowired将会无法正常注入
		*   而是需要通过setEnvironment方法进行注入,下面的其他接口都类似.
		*/
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		// 可以通过实现EmbeddedValueResolverAware接口来获取String类型值的解析器
		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
		// 资源加载器,例如使用:@Autowired ResourceLoaderAware aware; 将不会被注入
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		// 事件发布器
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		// 消息资源
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		// 应用的上下文信息
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

		// 注册一些可以自动装配的接口。 当类型为dependencyType时, 注入autowiredValue。为了解决一个类型有多个子类实现时,优先注入那个子类实现的问题。
		// 例如下面第一个,当注入类型为BeanFactory时,注入的值为beanFactory,默认为DefaultListableBeanFactory
		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
		// 当注入类型为ResourceLoader时,注入的值为ApplicationContext
		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
		// 当注入类型为ApplicationEventPublisher时,注入的值为ApplicationContext
		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
		// 当注入的类型为ApplicationContext时,注入的值为ApplicationContext.
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);

		// 增加一个bean的后置处理器,ApplicationListenerDetector
		// Register early post-processor for detecting inner beans as ApplicationListeners.
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

		// Detect a LoadTimeWeaver and prepare for weaving, if found.
		// 如果bean工厂中存在着名称为loadTimeWeaver的bean定义,则给bean工厂中加入LoaderTimeWeaverAwareProcessor后置处理器
		// 补充:1、增加对AspectJ的支持,在Java中织入分为3种:(1) 编译期织入; (2) 类加载期织入; (3) 运行期织入。编译期织入指的是在java编译期,
		//         采用特殊的编译器,将切面织入到java类中;类加载期织入则指的是通过特殊的类加载器,在字节码加载到JVM时,织入切面;运行期织入则是
		//         通过采用cglib或者jdk进行切面的织入。
		//      2、aspectJ中提供了两种方式:
		//         (1) 通过特殊编译器,在编译期,将aspectJ语言编写的切面类织入到java类中;
		//         (2) 类加载期织入,就是通过下面的LoadTimeWeaving
		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()));
		}

		// 给容器中注册一些与运行环境相关的单实例Bean
		if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
			// beanName: environment,直接将new出来的Spring内部对象放入到Spring的单实例缓存池中.
			beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
		}

		if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
			// beanName: systemProperties   方法:System.getProperties();
			beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
		}

		if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
			// beanName: systemEnvironment,   方法:System.getEnv();
			beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
		}
	}

postProcesssBeanFactory--Bean定义加载完毕之后实现,目前方法为空实现,可以自定义扩展。

invkeBeanFactoryPostProcessor--执行beanFactory的后置处理器 BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory,
			List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		/** 用来记录已经执行过的后置处理器 */
		Set<String> processedBeans = new HashSet<>();
		/**
		 * 判断beanFactory的类型是否为BeanDefinitionRegistry
		 * 此处beanFactory的类型为:DefaultListableBeanFactory,而DefaultListableBeanFactory是实现了BeanDefinitionRegistry接口的,
		 * 所以此处判断里面的结果为true.
		 *
		 * BeanDefinitionRegistry接口中定义了操作bean定义的常用方法。如:注册bean定义,移除bean定义,获取bean定义的数量,判断是否包含指定的bean定义等...
		 */
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

			// 用于存放普通的bean工厂的后置处理器
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();

			/**
			 * 用于存放类型为BeanDefinitionRegistryPostProcessor的bean工厂后置处理器。BeanDefinitionRegistry是bean定义的注册中心。用来存放所有的bean定义.
			 * BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor
			 */
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			/**
			 * 遍历所有的BeanFactoryPostProcessor,将普通的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor区分开.
			 */
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
					// 直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法.
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					// 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法
					registryProcessors.add(registryProcessor);
				} else {
					// 普通BeanFactoryPostProcessor,添加到regularPostProcessors中,用于最后执行postProcessBeanFactory方法.
					regularPostProcessors.add(postProcessor);
				}
			}

			// Do not initialize FactoryBeans here: We need to leave all regular beans
			// uninitialized to let the bean factory post-processors apply to them!
			// Separate between BeanDefinitionRegistryPostProcessors that implement
			// PriorityOrdered, Ordered, and the rest.

			// 保存本次将要执行的BeanDefinitionRegistryPostProcessor.
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// 下面的for循环中是找出所有实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类
			// 首先根据类型找出所有实现了BeanDefinitionRegistryPostProcessor接口的Bean的名称,然后依次循环遍历,判断是否实现了PriorityOrdered接口.
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					// 获取ppName对应的Bean实例,并添加到当前要执行的currentRegistryProcessors中

					// 此处会去创建容器中默认后置处理器对应的单实例bean
					// 此处的beanFactory.getBean会根据Bean的类型去创建Bean工厂后置处理器对象,有Bean的创建过程。
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					// 把将要执行的bean的名称加入到processedBeans中,后续后判断是否已经执行。避免重复执行.
					processedBeans.add(ppName);
				}
			}

			// 根据是否实现了PriorityOrder,Order接口以及具体的order数值来排序.
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			// 添加到registryProcessors,最后用于执行postProcessBeanFactory方法
			registryProcessors.addAll(currentRegistryProcessors);


			// 遍历当前要执行的所有BeanDefinitionRegistryPostProcessor,执行其postProcessBeanDefinitionRegistry方法.
			// 此处有一个重要的Bean定义注册中心的后置处理器:ConfigurationClassPostProcessor,配置类解析、条件注册的回调、方法及配置类的校验等操作
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			// 执行完毕之后,清空currentRegistryProcessors
			currentRegistryProcessors.clear();

			// 查找所有实现了BeanDefinitionRegistryPostProcessor接口的实现类
			// 重复查找是因为上面执行完了所有的BeanDefinitionRegistryPostProcessor类之后,可能又新增了其他的BeanDefinitionRegistryPostProcessor。
			//    比如:有一个自定义的BeanDefinitionRegistryPostProcessor中实现了PriorityOrdered接口之后,同时实现了BeanDefinitionRegistryPostProcessor接口.
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				// 校验是否实现了Ordered接口,并且之前未执行过
				// 使用上述执行完毕之后记录的Set集合判断是否执行过.
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					// 执行过之后,将其加入到已经执行过的集合中.
					processedBeans.add(ppName);
				}
			}
			// 排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			// 遍历所有的BeanDefinitionRegistryPostProcessor接口的实现类,
			//  并执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			// 清空
			currentRegistryProcessors.clear();

			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			// 最后,遍历其他除了实现Ordered接口和PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类,
			//  并执行其postProcessBeanDefinitionRegistry方法
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					// 过滤掉已经执行过的.
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						// 如果有BeanDefinitionRegistryPostProcessor被执行,则有可能产生新的BeanDefinitionRegistryPostProcessor
						// 所以需要再次循环查找一次.
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				// 依次执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
				// 执行时机是加载bean定义之前
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}

			// 执行所有BeanDefinitionRegistryPostProcessor接口的postProcessBeanFactory方法
			// 加载bean定义之后.但是实例化bean实例之前
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

			// 执行所有普通的BeanFactoryPostProcessor的postProcessBeanFactory方法。这些BeanFactoryPostProcessor是从方法传进来的.
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}


		// 至此,上面的过程已经处理完了入参beanFactoryPostProcessors和容器中所有的BeanDefinitionRegistryPostProcessor
		///////////////////////////////////////////////////////////////////////////////////////////////////////


		// 下面开始处理容器中的所有 BeanFactoryPostProcessor
		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		// 查找容器中所有实现了BeanFactoryPostProcessor接口的实现类
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		// 用于存放所有实现了PriorityOrdered接口的BeanFactoryPostProcessor
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		// 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName
		List<String> orderedPostProcessorNames = new ArrayList<>();
		// 用于实现了普通未实现Ordered接口的BeanFactoryPostProcessor的beanName
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		// 循环所有的BeanFactoryPostProcessors
		for (String ppName : postProcessorNames) {
			// 如果前面已经执行过,直接跳过
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			// 如果实现了PriorityOrdered接口,则获取bean并加入到priorityOrderedPostProcessors
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			// 如果是实现了Ordered接口的BeanFactoryPostProcessor,直接将其beanName放入到orderedPostProcessorNames
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			// 其他普通bean的名称放入到nonOrderedPostProcessorNames
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 对实现了PriorityOrdered接口的BeanFactoryPostProcessor进行排序
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 调用所有实现了PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// 获取所有实现了Ordered接口的BeanFactoryPostProcessor,并获取Bean实例,添加到orderedPostProcessors中,准备执行
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}

		// 对orderedPostProcessors排序
		sortPostProcessors(orderedPostProcessors, beanFactory);
		// 调用实现了Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// 获取所有普通的未实现Ordered接口和PriorityOrdered接口的BeanFactoryPostProcessor对应的Bean实例,并添加到nonOrderedPostProcessors
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}

		// 执行剩余未实现Ordered接口和PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法.
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		// 删除元数据(bean名称,bean定义等?)缓存,因为在执行后置处理器的过程中,原始的元数据可能已经被修改,例如:属性值中的占位符信息
		beanFactory.clearMetadataCache();
	}

registerBeanPostProcessor--注册所有bean的后置处理器. 注册所有实现了BeanPostProcessor接口的后置处理器

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

		// 根据类型获取所有BeanPostProcessor的BeanName
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// Register BeanPostProcessorChecker that logs an info message
		// a bean is created during BeanPostProcessor instantiation, i.e. when
		// a bean is not eligible for getting processed by all BeanPostProcessors.
		// 注册一个BeanPostProcessorChecker,用于记录Bean在BeanPostProcessor实例化时的信息
		// 此处+1的操作是因为下面给beanFactory中加入了一个BeanPostProcessorChecker后置处理器.
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// 存放实现了PriorityOrdered接口和未实现PriorityOrdered接口的BeanPostProcessor
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		// 用于存放Spring内部的BeanPostProcessor处理器
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		// 存放实现了Ordered接口和未实现Ordered接口的BeanPostProcessor的beanName.
		List<String> orderedPostProcessorNames = new ArrayList<>();
		// 存放未实现任何排序接口的BeanPostProcessor的beanName
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();

		// 对所有的BeanPostProcessor的beanName进行分类
		for (String ppName : postProcessorNames) {
			// 实现了PriorityOrdered接口的BeanPostProcessor的beanName
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					// 实现了MergedBeanDefinitionPostProcessor的BeanPostProcessor
					internalPostProcessors.add(pp);
				}
			}
			// 实现了Ordered接口的BeanPostProcessor的beanName
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			// 未实现PriorityOrdered接口和Ordered接口的BeanPostProcessor的beanName.
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, register the BeanPostProcessors that implement PriorityOrdered.
		// 优先注册实现了PriorityOrdered接口的BeanPostProcessor.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// Next, register the BeanPostProcessors that implement Ordered.
		// 保存实现了Ordered接口的BeanPostProcessor.
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// 注册实现了Ordered接口的BeanPostProcessor.
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// Now, register all regular BeanPostProcessors.
		// 注册普通的BeanPostProcessor(既没有实现PriorityOrdered接口,也没有实现Ordered接口.)
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
		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.
		// 最后注册所有实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// Re-register post-processor for detecting inner beans as ApplicationListeners,
		// moving it to the end of the processor chain (for picking up proxies etc).
		// 添加ApplicationListenerDetector的BeanPostProcessor。
		//   重复添加一次该beanPostProcessor是为了将该beanPostProcessor移动到beanPostProcessor对应的list的最后
		//	 上述处理bean的过程中,可能存在一些内部bean也是ApplicationListenerDetector类型,所以需要在添加一次
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

initMessageSource--初始化消息源

protected void initMessageSource() {
		// 获取bean工厂
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		// 判断是否在bean工厂中定义了id为messageSource的bean对象
		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
			// 如果有id为messageSource,而且类型是MessageSource的组件,直接赋值给messageSource属性
			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;
				if (hms.getParentMessageSource() == null) {
					// Only set parent context as parent MessageSource if no parent MessageSource
					// registered already.
					hms.setParentMessageSource(getInternalParentMessageSource());
				}
			}
			if (logger.isTraceEnabled()) {
				logger.trace("Using MessageSource [" + this.messageSource + "]");
			}
		}
		else {
			// Use empty MessageSource to be able to accept getMessage calls.
			// 如果没有,则创建一个DelegatingMessageSource类型的messageSource对象
			DelegatingMessageSource dms = new DelegatingMessageSource();
			dms.setParentMessageSource(getInternalParentMessageSource());
			this.messageSource = dms;
			// 将messageSource注册到容器中,在获取国际化配置文件中的某个值时,可以直接通过注入MessageSource,
			// 调用其getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale)方法来获取.
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
			}
		}
	}

initApplicationEventMulticaster--初始化事件派发器,用来发布事件

protected void initApplicationEventMulticaster() {
		// 获取Bean工厂
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		// 判断当前的bean工厂中有没有id为applicationEventMulticaster的事件派发器
		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
			// 如果有,则直接获取到ApplicationEventMulticaster类型的事件多播器,并赋值给applicationEventMulticaster.
			this.applicationEventMulticaster =
					beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
			if (logger.isTraceEnabled()) {
				logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
			}
		}
		else {
			// 如果没有则创建一个类型为SimpleApplicationEventMulticaster事件监听器,
			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
			// 将创建的事件多播器注册到容器中,在其他组件需要派发事件时,直接获取这个applicationEventMulticaster
			beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
						"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
			}
		}
	}

onRefresh--用来初始化一些特殊的Bean 如Spring Boot tomcat

registerListeners--注册监听器

protected void registerListeners() {
		// Register statically specified listeners first.
		// 将注册的监听器绑定到广播器
		for (ApplicationListener<?> listener : getApplicationListeners()) {
			getApplicationEventMulticaster().addApplicationListener(listener);
		}
		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let post-processors apply to them!
		// 根据类型获取listener监听器的名称
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String listenerBeanName : listenerBeanNames) {
			// 将事件监听器注册到派发器中,以后使用的时候,就可以直接通过事件派发器执行.
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		}
		// Publish early application events now that we finally have a multicaster...
		// 如果之前存在着应用事件,则直接发布.比如如下自定义监听器的示例,会在此进行发布:
		/**
		 *   // 1.先自定义事件
			 public class TestEvent extends ApplicationEvent{
				 private User user;
				 public TestEvent(Object source,User user) {
					 this.user=user;
				 }
				 public User getUser() {
					return user;
				 }
				 public void setUser(User user) {
					this.user = user;
				 }
			 }
		 	 // 2.自定义监听器
			 public class TestListener implements ApplicationListener<TestEvent>{
				 public void onApplicationEvent(TestEvent event) {
					 User user = event.getUser();
					 System.out.println(user.getEmail());
				 }
			 }

		 	// 3.配置监听器
		 	<bean id="testListener" class="com.wb.listener.TestListener"></bean>

		 	// 4.发布事件
			 MyApplicationContext context=new MyApplicationContext("classpath:applicationContext.xml");
			 User user=new User();
			 user.setEmail("1111");
			 context.publishEvent(new TestEvent("", user));
		 */


		/**
		 * 派发之前产生的事件。
		 * earlyApplicationEvent是在prepareRefresh中声明的.
		 */
		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
		this.earlyApplicationEvents = null;
		if (earlyEventsToProcess != null) {
			// earlyApplicationEvents如果不为空的话,则进行事件的派发
			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
				// 调用时间派发器进行事件的派发操作
				getApplicationEventMulticaster().multicastEvent(earlyEvent);
			}
		}
	}

finishBeanFactoryInitialization--初始化所有剩余的单实例Bean(没有使用懒加载的Bean)

	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 1. 初始化此上下文的转换服务,用来自定义将Spring中的某个Bean的属性从一个类型转换到另外一个类型.
		//    判断Bean工厂中是否存在名称为conversionService的转换服务bean,如果存在而且类型为ConversionService,则获取该Bean实例,并将其设置到BeanFactory中
		/**
		 * 例如:
		 * (1)有如下的javaBean:
		 * public class Person {
		 *     public String name;
		 *     public Date birthday;
		 *     ...
		 * }
		 * (2)有如下的xml配置:
		 * <bean name="person" class="com.wb.test.Person">
		 *     <property name="name" value="wangbing"/>
		 *     <property name="birthday" value="1999-03-03"/>
		 * </bean>
		 * (3)有如下的测试类:
		 * ApplicationContext acx = new ClasspathXmlApplicationContext("test.xml");
		 * Person person = (Person) acx.getBean("person");
		 * System.out.println(person.name);
		 * System.out.println(person.birthday); // 改行会报错,提示字符串类型不能转换为日期类型
		 *
		 * (4)可以通过定义如下名称的bean,将某种类型的属性值转换为另外一种类型.
		 * <bean name="conversionService" class="com.wb.test.MyConversionService" />
		 * public class MyConversionService implements ConversionService {
		 *    // 实现是否能转换以及具体转换的方法。
		 *	  public boolean canConvert(Class<?> sourceType, Class<?> targetType) {}
		 *	  public boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType) {}
		 *    public <T> T convert(Object source, Class<T> targetType) {}
		 *    // 可以在该方法中实现转换逻辑。如果源类型sourceType是String类型的话,将其转换为Date类型返回。
		 *    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {}
		 * }
		 */
		// 2.在Spring中,如果需要配置自定义的转换器,还可以直接利用Spring提供的ConversionServiceFactoryBean来完成。自己只需要实现具体的转换逻辑即可
		/**
		 * (1)配置conversionService对应的工厂Bean:
		 * <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
		 *     <property name="converters">
		 *			<bean class="com.wb.test.MyConverter"/>
		 *     </property>
		 * </bean>
		 * (2)然后自己去实现MyConverter即可:
		 *  public class MyConverter implements Converter<String,Date> {
		 *		@Override
		 *		public Date convert(String source) {
		 *			DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		 *			try {
		 *				return format.parse((String) source);
		 *			} catch (ParseException e) {
		 *				e.printStackTrace();
		 *			}
		 *			return null;
		 *		}
		 *	}
		 */
		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));
		}
		/**
		 * 如果beanFactory之前没有注册嵌入值解析器,则注册默认的嵌入值解析器,
		 *  主要用于注解属性值的解析例如:@Value("${app.name}")。
		 */
		// 值解析器设置的地方:在调用invokeBeanfactoryPostProcessor方法的时候,通过PropertySourcesPlaceholderConfigurer的后置处理方法设置进去的
		if (!beanFactory.hasEmbeddedValueResolver()) {
			// 调用resolvePlaceholders方法解析strVal对应的值
			beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
		}
		/**
		 * 初始化所有实现了LoadTimeWeaverAware接口的子类,用于类在加载进入jvm之前,动态增强类
		 *  这特别适用于Spring的JPA支持,其中load-time weaving加载织入对JPA类转换非常必要
		 */
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			getBean(weaverAwareName);
		}

		// 停止使用临时的类加载器.
		beanFactory.setTempClassLoader(null);

		// 缓存(冻结)所有的BeanName(注册的bean定义不会被修改或进一步做处理了,因为下面马上要创建Bean的实例对象了)
		beanFactory.freezeConfiguration();

		// 初始化所有的单实例Bean,包括创建单实例bean的全部过程
		beanFactory.preInstantiateSingletons();
	}
preInstantiateSingletons-初始化所有的单实例Bean
	public void preInstantiateSingletons() throws BeansException {
		if (logger.isTraceEnabled()) {
			logger.trace("Pre-instantiating singletons in " + this);
		}

		// 创建BeanDefinitionNames的副本BeanNames用于后续的遍历,以允许init等方法注册新的bean定义.
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// 遍历所有的beanNames,触发所有非懒加载单例bean的初始化,即:创建所有的单实例Bean
		for (String beanName : beanNames) {
			// 获取beanName对应的MergedBeanDefinition.
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			// 如果bd对应的Bean实例满足:(不是抽象类 && 是单例 && 不是懒加载)
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

				// 判断BeanName对应的Bean实例是否是FactoryBean.
				if (isFactoryBean(beanName)) {
					// 通过beanName获取FactoryBean的实例,factoryBean的名称是:"&" + beanName
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						// 判断这个FactoryBean是否需要紧急初始化.
						// System.getSecurityManager()方法是获取系统权限管理器,Java为了防止恶意代码执行(修改,删除操作系统文件),做了权限管理,
						//   默认的安全管理器配置文件是: $JAVA_HOME/jre/lib/security/java.policy
						/**
						 * 在做访问控制决定时,如果遇到通过调用不带上下文参数(请参阅下文,以获取关于上下文参数的信息)的 doPrivileged 标记为“特权”的调用方,
						 *  则 checkPermission 方法将停止检查。如果该调用方的域具有指定的权限,则不进行进一步检查,并且 checkPermission 正常返回,
						 *  指示允许所请求的访问。如果该域不具有指定的权限,则通常抛出异常。
						 *
						 *
						 *  AccessController.doPrivileged()方法的例子:
						 *  假设有这样一种情况:A程序想在 C:\Users\Jack\Desktop\test1  这个目录中新建一个文件,但是它没有相应的权限,
						 *   但是它引用了另外一个Jar包B,刚好B有权限在C:\Users\Jack\Desktop\test1目录中新建文件,
						 *   还有更巧的是B在新建文件的时候采用的是AccessController.doPrivileged方法进行的,这种情况下,A就可以调用B的创建文件的方法进行创建文件了。
						 */
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							// 如果需要紧急初始化,则通过beanName获取Bean的实例.
							getBean(beanName);
						}
					}
				}
				else {
					// 如果BeanName对应的Bean实例不是FactoryBean,则通过BeanName去获取Bean实例.
					getBean(beanName);
				}
			}
		}

		/**
		 * 上一步for循环中已经创建完了所有的单实例Bean,这个for循环中,会拿出所有的单实例Bean,
		 *   然后遍历,判断单实例bean是否实现了SmartInitializingSingleton接口,如果实现了该接口,
		 *   则调用单实例Bean的afterSingletonsInstantiated方法
		 */
		for (String beanName : beanNames) {
			// 获取beanName对应的bean实例
			Object singletonInstance = getSingleton(beanName);
			// 判断当前的bean是否实现了SmartInitializingSingleton接口.
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				// 触发SmartInitializingSingleton实现类的afterSingletonInstantiated方法.
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					/**
					 * 如果实现了SmartInitializingSingleton接口,则会调用afterSingletonInstantiated方法
					 *   例如@EventListener注解的实现原理,就是利用EventListenerMethodProcessor后置处理器完成的,
					 *   而在EventListenerMethodProcessor中就是实现了SmartInitializingSingleton接口
					 */
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}
getBean doGetBean--获取单实例Bean
@Override
	public Object getBean(String name) throws BeansException {
		// 空方法
		return doGetBean(name, null, null, false);
	}

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
		// 获取真正的BeanName。主要包括:(1) 去掉FactoryBean名称前面的&前缀;(2) bean别名解析;
		final String beanName = transformedBeanName(name);
		Object bean;

		// 先尝试从缓存中获取单实例Bean,如果能获取到,说明已经被创建过
		//   注意:如果是通过FactoryBean方式创建对象。在根据名称获取目标bean对象(非FactoryBean实例)时,此处返回的sharedInstance是FactoryBean对象
		Object sharedInstance = getSingleton(beanName);
		/**
		 * 当组件实现了FactoryBean接口,并重写了getObject方法时。在从容器中获取bean的时候,sharedInstance就是容器中返回的bean对象
		 * 此时sharedInstance不为空,就会调用getObjectForBeanInstance方法,这个方法内部会调用子类重写的getObject方法.
 		 */
		if (sharedInstance != null && args == null) {
			if (logger.isTraceEnabled()) {
				if (isSingletonCurrentlyInCreation(beanName)) {
					logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
							"' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
					logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
				}
			}
			// 获取bean对象,包括使用FactoryBean来创建bean的逻辑.
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}
		else {
			// 如果当前创建的是单实例类型的bean,则尝试解决循环依赖,此处仅仅只是一个校验;如果当前的多实例bean正在创建中,而且存在循环依赖,直接抛出异常
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}
			// 获取Bean的父工厂? 在Spring和SpringMVC整合之后,会存在着父子容器问题
			// TODO 父子容器处理
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// Not found -> check parent.
				String nameToLookup = originalBeanName(name);
				if (parentBeanFactory instanceof AbstractBeanFactory) {
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else if (requiredType != null) {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
				else {
					return (T) parentBeanFactory.getBean(nameToLookup);
				}
			}

			// 标记Bean已经被创建,防止多线程时,Bean可能会被创建多个,就不是单实例了
			if (!typeCheckOnly) {
				// 将beanName对应的bean定义从mergedBeanDefinitions中移除,并将beanName添加到alreadyCreated集合中.
				markBeanAsCreated(beanName);
			}

			try {
				// 获取合并之后的Bean定义
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

				// 校验bean对应的类是否为抽象的,如果bean对应的类标注了抽象,直接会抛出异常
				checkMergedBeanDefinition(mbd, beanName, args);

				/**
				 * 获取当前Bean所依赖的其他Bean
				 * 例如:<bean class="com.wb.beans.User" scope="prototype" depends-on="book,football" />,里面的depends-on就是依赖的bean
 				 */
				String[] dependsOn = mbd.getDependsOn();

				// 如果有依赖的Bean
				if (dependsOn != null) {
					for (String dep : dependsOn) {
						// 判断是否存在着循环依赖. a->b b->c c->a这种情况
						/**
						 * 该步骤里面会去解决bean之间的循环依赖,例如如下的bean依赖情况:
						 *
						 * <bean name="classA" class="com.wb.spring.finishBeanFactoryInitialization.domain.ClassA" depends-on="classB"></bean>
						 * <bean name="classB" class="com.wb.spring.finishBeanFactoryInitialization.domain.ClassB" depends-on="classA"></bean>
						 *
						 * 通过acx.getBean("classA");去获取classA对应的bean时,就会提示循环依赖异常。
						 */
						if (isDependent(beanName, dep)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
						}
						// 维护依赖和被依赖的bean之间的关联关系,Map<String,Set<String>> dependentMap
						registerDependentBean(dep, beanName);
						try {
							// 先去创建当前bean所依赖的其他bean对象
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				// bean定义如果是单例的,则调用createBean方法进行单实例bean的创建.
				if (mbd.isSingleton()) {
					// 此处的lambda表达式为:ObjectFactory的getObject方法
					sharedInstance = getSingleton(beanName, () -> {
						try {
							/**
							 * 创建对象并初始化,Spring用来创建Bean实例的核心方法
							 *  此处调用的子类AbstractAutowireCapableBeanFactory的createBean方法.
							 */
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							// 如果创建单实例bean失败,则会删除关于该bean的一切信息,包括三级缓存和已经注册的bean集合中有关该bean的信息
							destroySingleton(beanName);
							throw ex;
						}
					});
					/**
					 * 从bean的实例中获取对象.上述创建出来的bean对象sharedInstance只代表了bean的初始状态,
					 *   并不一定是我们最终需要的bean。
					 *
					 * 举个例子,假如我们需要对工厂bean进行处理,那么这里得到的其实是工厂bean的初始状态,
					 *   但是我们真正需要的是工厂bean中定义的 factory-method方法中返回的bean,
					 *   而getObjectForBeanInstance方法就是完成这个工作的。
					 *
					 *
					 *   真实作用:如果一个类实现了FactoryBean接口,则上述bean创建完成之后,其实只是创建好了工厂bean,但是真实的应用
					 *    bean还未创建,此处将会回调FactoryBean的getObject自定义方法进行应用bean的创建工作。
					 */
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}
				// 当前需要创建的bean如果是多例
				else if (mbd.isPrototype()) {
					// 创建多实例bean
					Object prototypeInstance;
					try {
						// 进行多实例bean创建之前的准备工作,将当前正在创建的多实例bean的名称添加到prototypesCurrentlyInCreation中.
						beforePrototypeCreation(beanName);
						// 创建多实例对象,和创建单实例bean使用的是同一个方法
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
						// 从prototypesCurrentlyInCreation【ThreadLocal】中移除
						afterPrototypeCreation(beanName);
					}
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}
				// 未明确指定将要创建的bean是单例的还是多例的
				else {
					String scopeName = mbd.getScope();
					// 从bean定义中获取bean的scope信息,如果bean的scope信息为null,也就是随意设置的scope,直接抛出异常
					final Scope scope = this.scopes.get(scopeName);
					if (scope == null) {
						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
					}
					try {
						// 根据指定的scope获取bean实例
						Object scopedInstance = scope.get(beanName, () -> {
							// 初始化之前准备工作,将bean的名称添加到prototypesCurrentlyInCreation
							beforePrototypeCreation(beanName);
							try {
								// 创建bean实例
								return createBean(beanName, mbd, args);
							}
							finally {
								// 从prototypesCurrentlyInCreation中移除
								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;
			}
		}
		/**
		 * 判断是否需要将bean转换为我们指定类型的Class,如果需要转换,则使用自定义的TypeConverter进行bean类型的转换
		 *  如果未指定TypeConverter,则默认使用SimpleTypeConverter,converter需要设置一个用来转化的Service实现类,即:ConversionService,
		 *  ConversionService是在finishBeanFactoryInitialization方法的最前面进行注册的,可以在xml中配置对应的ConversionService实现类
		 */
		if (requiredType != null && !requiredType.isInstance(bean)) {
			try {
				T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
				if (convertedBean == null) {
					throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
				}
				return convertedBean;
			}
			catch (TypeMismatchException ex) {
				if (logger.isTraceEnabled()) {
					logger.trace("Failed to convert bean '" + name + "' to required type '" +
							ClassUtils.getQualifiedName(requiredType) + "'", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}
getSingleton--尝试从缓存中获取单实例Bean过
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		// 根据beanName从单实例对象缓存中获取单例对象(singletonObjects为一个ConcurrentHashMap,就是用来保存所有的单实例Bean的,
		//   key:beanName value:beanInstance) 相当于一级缓存
		Object singletonObject = this.singletonObjects.get(beanName);
		// 如果缓存中不存在,而且beanName对应的单实例Bean正在创建中.
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			// 加锁操作.
			synchronized (this.singletonObjects) {
				// 从早期单实例对象缓存中获取单例对象(之所以称为单实例早期对象,
				//   是因为earlySingletonObjects里面的对象都是通过提前曝光的ObjectFactory创建出来的,还未进行属性的填充)
				singletonObject = this.earlySingletonObjects.get(beanName);


				// 如果早期单实例对象缓存中没有,而且允许创建早期单实例对象引用
				if (singletonObject == null && allowEarlyReference) {
					// 则从单例工厂缓存中获取BeanName对应的单例工厂.
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						// 如果存在着单例对象工厂,则通过工厂创建一个单例对象,
						// 调用的是:addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))中的拉姆达表达式
						singletonObject = singletonFactory.getObject();
						// 将通过单例对象工厂创建的单例对象放入到早期单例对象缓存中,这个早期对象指的是一个空的未完成属性赋值和初始化的对象。
						this.earlySingletonObjects.put(beanName, singletonObject);
						// 移除该beanName对应的单例对象工厂,因为该单例工厂已经创建了一个实例对象,并且放入到earlySingletonObjects缓存中了,
						//  所以,后续通过beanName获取单例对象,可以通过earlySingletonObjects缓存获取到,不需要再用到该单例工厂.
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}
createBean--创建对象并初始化
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

		if (logger.isTraceEnabled()) {
			logger.trace("Creating instance of bean '" + beanName + "'");
		}
		// 获取bean的定义信息
		RootBeanDefinition mbdToUse = mbd;

		// 解析bean的类型,使用类加载器真实加载Bean的Class
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}
		try {
			// 对lookup-method和replaced-method指定的方法进行预处理.
			// 主要是标记bean中是否有重载方法。如果一个类有多个重载方法,在后面真正调用或者增强的时候,还需要根据参数类型和参数个数判断调用的哪一个方法,
			// 此处相当于是提前处理。对于只有一个方法的bean,直接标记为无重载方法.
			//  使用的地方:该处设置完标志位之后,在后期的实例化过程中使用cglib实例化策略的时候会使用到。
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}
		try {
			// 在真正创建Bean之前,执行bean实例化之前的一些工作,可以在此处生成自定义的代理对象.
			// 通过实现InstantiationAwareBeanPostProcessor接口来进行自定义扩展,生成自定义的代理对象
			//   可参考:【示例代码:com.wb.spring.instantiationaware.MyInstantiationAwareBeanPostProcessor】
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
		catch (Throwable ex) {
			throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
					"BeanPostProcessor before instantiation of bean failed", ex);
		}
		try {
			// 执行创建Bean的操作
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}
		catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
			// A previously detected exception with proper bean creation context already,
			// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
			throw ex;
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
		}
	}
doCreateBean--执行创建Bean的操作
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {

		// Instantiate the bean.
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			// 删除之前工厂bean缓存中的工厂bean对象,重新进行实例化.
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		// 创建Bean的实例,并且包装为一个包装对象返回.
		if (instanceWrapper == null) {
			// 使用策略方法创建实例,包括:工厂方法,构造函数注入,简单初始化.
			// TODO 里面调用的方法超级长
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		// 获取新创建的bean对象和对应的class
		final Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();

		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}

		// Allow post-processors to modify the merged bean definition.
		synchronized (mbd.postProcessingLock) {
			// 如果还未执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
			if (!mbd.postProcessed) {
				try {
					// 依次调用所有MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法,用来处理类中使用注解标注的属性,并放入到缓存中.
					/**
					 * 其中包括了
					 * 	【AutowiredAnnotationBeanPostProcessor】,  用来处理@Autowired,@Value,@Inject注解
					 * 	【CommonAnnotationBeanPostProcessor】,    用来处理@Resource注解
					 * 	【RequiredAnnotationBeanPostProcessor】, 用来处理@Required注解
					 * 	【InitDestroyAnnotationBeanPostProcessor】,用来处理@Predestroy和@PostConstruct注解
					 * 	【ScheduledAnnotationBeanPostProcessor】,用来处理@Scheduled注解
					 * 		等后置处理器
					 */
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}
		/**
		 * 当前的bean是单例的 && 允许bean之间的循环依赖 && bean正在创建中
		 */
		boolean earlySingletonExposure = (mbd.isSingleton()
				&& this.allowCircularReferences
				&& isSingletonCurrentlyInCreation(beanName));
		// 判断是否需要提前暴露自己。如果需要提前暴露,会将创建完但未填充属性和初始化的bean放入到singletonFactories中,用来解决循环依赖.
		// 		Spring中的单实例Bean,而且是使用属性注入的方式,默认支持循环依赖的;如果是prototype类型的,默认不支持循环依赖
		//     如果是单例bean,而且使用构造器注入的方式,默认不支持循环依赖,可在构造器上添加@Lazy注解,让依赖的属性延迟初始化来解决
		//     如果是单例bean和prototype类型的bean混用,则如果先创建单例,可以成功,如果先创建prototype类型的bean,则会失败
		if (earlySingletonExposure) {
			if (logger.isTraceEnabled()) {
				logger.trace("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			/**
			 * getEarlyBeanReference: 是用来获取到被SmartInstantiationAwareBeanPostProcessor后处理器处理过的刚刚实例化结束的bean对象
			 *
			 * addSingletonFactory: 是用来将刚刚初始化的bean对象放入到singletonFactories中,singletonFactories是个map集合,
			 *  key: bean的名称,value: 是一个ObjectFactory,当存在着循环依赖时,可以通过ObjectFactory.getObject方法获取到刚刚实例化的bean对象
			 */
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}
		/** 初始化单实例bean。 包括:填充属性及执行初始化方法 */
		Object exposedObject = bean;
		try {
			/**
			 * 【依赖注入】
			 * 填充的属性包括:普通属性和使用@Autowired和@Resource注解标注的引用类型属性的赋值。使用了反射操作set方法完成赋值.
			 *
			 * eg: 重点操作举例:
			 * 		【创建完成Bean之后,填充Bean的属性,填充过程中会调用InstantiationAwareBeanPostProcessorAdaptor类的postProcessProperties方法】
			 */
			populateBean(beanName, mbd, instanceWrapper);

			/**
			 * 完成Bean的初始化(执行afterPropertiesSet和init-method)
			 * 		注意:会调用@PostConstruct标注的方法,这个方法是在Bean创建完成,而且属性填充完成之后,才会被调用
			 */
			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<>(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.");
					}
				}
			}
		}
		try {
			/**
			 * 注册bean的销毁方法,如果bean不是prototype类型,而且requiresDestruction方法返回true
			 *  则会将当前的bean放入到一个需要被销毁的map集合中.
			 */
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}
		return exposedObject;
	}
populateBean--【依赖注入】 填充的属性
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		if (bw == null) {
			if (mbd.hasPropertyValues()) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				return;
			}
		}

		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
		// state of the bean before properties are set. This can be used, for example,
		// to support styles of field injection.
		// 是否需要继续进行属性填充.
		boolean continueWithPropertyPopulation = true;

		/**
		 * 首先判断bean在初始化的时候是否需要进行属性值的注入.
		 *
		 * 可以通过扩展InstantiationAwareBeanPostProcessor接口来实现是否进行属性值注入的判断逻辑。
		 * 如下,直接返回false,则所有标注@Autowired注解的都不会进行依赖注入
		 *
		 * @Component
		 * class MyProcessor implements InstantiationAwareBeanPostProcessor {
		 * 	   @Override
		 *     public boolean postProcessAfterInstantiation(Object bean, String beanName) {
		 *         return false;
		 *     }
		 * }
		 */
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}
		// 如果不需要进行属性的依赖注入,则直接返回.
		if (!continueWithPropertyPopulation) {
			return;
		}

		/** 获取当前正在实例化的bean的所有属性及值,类型为map: key:属性名称,value:值或者引用 */
		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

		/** 如果bean定义中指定的注入类型为通过名称或者通过类型注入,则解析出依赖的属性值或引用。但是该步骤不会进行属性的赋值操作 */
		if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
			/** 如果是按照名称进行自动注入,通过属性名称获取依赖的属性值或者引用 */
			if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
				autowireByName(beanName, mbd, bw, newPvs);
			}
			/** 如果是按照类型进行自动注入,则通过属性的类型获取依赖的属性值或者引用 */
			if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
				autowireByType(beanName, mbd, bw, newPvs);
			}
			pvs = newPvs;
		}

		// 当前bean是否有InstantiationAwareBeanPostProcessor类型的后置处理器
		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
		// 自动装配时需要进行依赖的检查
		boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

		PropertyDescriptor[] filteredPds = null;
		// 如果存在着InstantiationAwareBeanPostProcessor【继承自BeanPostProcessor】类型的后置处理器
		if (hasInstAwareBpps) {
			if (pvs == null) {
				pvs = mbd.getPropertyValues();
			}
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				// 如果是InstantiationAwareBeanPostProcessor的实例
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					// 则依次执行后置处理器的postProcessProperties,首先使用postProcessProperties,获取属性值
					PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						if (filteredPds == null) {
							filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
						}
						// 如果通过postProcessProperties未获取到属性值,再通过postProcessPropertyValues获取属性值
						pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						if (pvsToUse == null) {
							return;
						}
					}
					pvs = pvsToUse;
				}
			}
		}
		// 如果需要进行依赖的检查【包括简单类型和对象类型】
		if (needsDepCheck) {
			if (filteredPds == null) {
				/**
				 * 通过一些过滤条件过滤掉不需要自动注入属性值的属性
				 * 其中包括:refresh()方法的prepareBeanFactory步骤中所忽略的接口.
 				 */
				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			}
			/**
			 * 检查属性值的依赖。如果bean中的属性有setter方法,但是属性名称没有包含在属性值列表中,将会抛出异常
			 */
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}
		/** 如果解析出来的依赖属性值集合不为空,则通过applyPropertyValues进行属性值的填充 */
		if (pvs != null) {
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
	}
initializeBean--完成Bean的初始化(执行afterPropertiesSet init-method和BeanPostProcessor的Before和After方法)
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			/**
			 * 调用Bean实现的Aware接口的方法,主要包括下面三个接口
			 * BeanNameAware ----> setBeanName()
			 * BeanClassLoaderAware ----> setBeanClassLoader()
			 * BeanFactoryAware  ----> setBeanFactory()
			 */
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			/** 调用Bean对象的postProcessBeforeInitialization方法,此处会执行标注@PostConstruct注解的方法 */
			// 此处会调用ApplicationContextAwareProcessor执行其他的aware方法.
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
		try {
			/**
			 * 执行Bean的初始化方法:
			 *
			 * 1.先判断Bean是否实现了InitializingBean接口,如果实现了InitializingBean接口,则调用Bean对象的afterPropertiesSet方法;
			 * 2.然后判断Bean是否有指定init-method方法,如果指定了init-method方法,则调用bean对象的init-method指定的方法.
			 */
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
			/**
			 * 调用Bean对象的postProcessAfterInitialization方法
			 *
			 * 如果需要创建代理,在该步骤中执行postProcessAfterInitialization方法的时候会去创建代理
			 * 调用AbstractAutoProxyCreator类的postProcessAfterInitialization方法,然后调用wrapIfNecessary方法去创建代理.
			 *
			 *
			 * 另外还有一些Aware接口,也会在该步骤中执行,例如:ApplicationContextAwareProcessor后置处理器,对应的setApplicationContext方法会被执行.
			 */
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}

finishRefresh --发布容器刷新完成事件

protected void finishRefresh() {
		// Clear context-level resource caches (such as ASM metadata from scanning).
		// 清空资源缓存.
		clearResourceCaches();

		// Initialize lifecycle processor for this context.
		// 初始化声明周期处理器,用于处理Bean的生命周期.
		initLifecycleProcessor();

		// Propagate refresh to lifecycle processor first.
		// 使用声明周期处理器传播刷新事件
		getLifecycleProcessor().onRefresh();

		// Publish the final event.
		// 在Context中发布刷新事件
		publishEvent(new ContextRefreshedEvent(this));

		// Participate in LiveBeansView MBean, if active.
		// 将本Context注册到ListBeansView中。包括注册Spring ApplicationContext对应的MBean
		LiveBeansView.registerApplicationContext(this);
	}