Spring Context初始化流程

Context初始化流程

  • XML配置方式的Context
  • Spring Boot的Context
  • Web服务的Context
    以上三种创建时都会调用AbstractApplicationContext类的refresh方法,流程如下:
  1. 首先对刷新进行准备,包括设置开始时间、激活状态、初始化Context环境中的占位符,这个动作根据子类的需求由子类来执行,然后验证是否缺失必要的properties。
  2. 刷新并获取内部的BeanFactory。
  3. 对BeanFctory进行准备工作,比如设置类加载器和后置处理器、配置不进行自动装配的类型、注册默认的环境Bean。
  4. 为Context的子类提供后置处理的BeanFactory的扩展能力。如果子类想在Bean定义加载完成后,开始初始化上下文之前做一些特殊逻辑,可以复写这个方法。
  5. 执行Context中注册BeanFactory后缀处理器。这里有两种后置处理器,一种是可以注册Bean的后缀处理器,另一种是对BeanFactory进行处理的后置处理器。执行的顺序是,先按照优先级执行可注册Bean的处理器,再按照优先级执行针对BeanFactory的处理器。对于Spring Boot来说,这一步会进行注解BeanDefinition的解析,由ConfigurationClassPostProcessor触发,由ClassPathBeanDefinitionScanner解析并注册到BeanFactory。
  6. 按照优先级顺序在BeanFactory中注册Bean的后缀处理器,Bean后置处理器可以在Bean初始化前、后执行处理。
  7. 初始化消息源,消息源用来支持消息的国际化。
  8. 初始化应用事件播器,事件广播器用来向ApplicationListener通知各种应用产生的事件,是一个标准的观察者模式。
  9. 是留给子类的扩展步骤,用来让特定的Context子类初始化其他的Bean。
  10. 把实现了ApplicationListener的Bean注册到事件广播器,并对广播器中的早期未广播事件进行通知。
  11. 冻结所有Bean描述信息的修改,实例化非延迟加载的单例Bean。
  12. 完成上下文的刷新工作,调用LifecycleProcessor类的onFresh()方法以及发布ContextRefreshedEvent事件。
  13. 在finally中重置公共的缓存,比如ReflectionUtils中的缓存、AnnotationUtils中的缓存等等。
    Spring源码:
@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// 1. Prepare this context for refreshing.
			prepareRefresh();

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

			// 3. Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// 4. Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// 5. Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

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

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

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

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

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

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

				// 12. Last step: publish corresponding event.
				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.
				destroyBeans();

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

				// Propagate exception to caller.
				throw ex;
			}

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

如有问题,请指出,一起学习,一起努力,加油~~

你可能感兴趣的:(Java学习,java,spring)