Spring IOC (九)refresh 分析 后续 过程 分析

花了几篇文章 探究Spring的 BeanPostProcessorBeanFactoryPostProcessor,本文则开始接受refresh 后续逻辑。

registerBeanPostProcessors

registerBeanPostProcessors 方法主要是调用所有BeanPostProcess 的自带方法:

	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 获取所有的 BeanPostProcessor
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// 记录信息,即当前beanFactory有几个beanpostProcessor,而最终要有多少个。
		// +1 的原因是加上 BeanPostProcessorChecker 类型BeanPostProcessor
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		// BeanPostProcessorChecker 主要是检查数量
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// 将实现PriorityOrdered的接口放入priorityOrderedPostProcessors中,Ordered 放入 orderedPostProcessorNames,其他放入 nonOrderedPostProcessorNames中。
		// 另外,如果既是PriorityOrdered又是MergedBeanDefinitionPostProcessor,则放入internalPostProcessors
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		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);
			}
		}

		// 将所有 priorityOrderedPostProcessors 注入beanFacotory.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 将所有orderedPostProcessors 注入beanFactory,并将MergedBeanDefinitionPostProcessor 放入internalPostProcessors 中.
		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);
			}
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// 将所有其他的 nonOrderedPostProcessors 注入beanFactory,并将MergedBeanDefinitionPostProcessor 放入internalPostProcessors 中. 
		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);

		// 重新再将 internalPostProcessors 注入beanFactory中.
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		//  添加 ApplicationListenerDetector 到beanFactory中Re-register post-processor for detecting inner beans as ApplicationListeners,
		// moving it to the end of the processor chain (for picking up proxies etc).
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

上面逻辑主要是区分 不同类型的 BeanPostProcessors,并按照 PriorityOrdered -> Ordered -> 其他 顺序放入beanFactory中。
而最后,将 MergedBeanDefinitionPostProcessor 类型节点,重新放到后面。而将 ApplicationListenerDetector 则用于永远放到最后一个。
ApplicationListenerDetector 主要是将 属于 ApplicationListener 类型bean注册进 ApplicationEventMulticaster,以便全局事件通知。

initMessageSource

初始化一个MessageSource,主要用于 国际化i18n。如果没有在beanFactory中配置 messageSource 的bean,则会创建一个空的messageSourceDelegatingMessageSource进行处理。

initApplicationEventMulticaster

初始化 消息广播器,如果当前beanFactory中没有,同样会创建一个默认的 ApplicationEventMulticasterSimpleApplicationEventMulticaster
并配置金beanFactory:

	protected void initApplicationEventMulticaster() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
			this.applicationEventMulticaster =
					beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
			if (logger.isTraceEnabled()) {
				logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
			}
		}
		else {
			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
			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

可以用来做一些特殊的refresh工作,例如提前初始化一些特殊的bean等。

registerListeners

将实现了 ApplicationListener 接口的bean注册进消息广播中ApplicationEventMulticaster,这样一旦有消息,就可以分发到每个对应的 ApplicationListener 类型的bean中。

	protected void registerListeners() {
		// Register statically specified listeners first.
		for (ApplicationListener<?> listener : getApplicationListeners()) {
		// 通过 applicationContext.addApplicationListeners 的bean
		// 将所有的 ApplicationListener 类型bean注册进ApplicationEventMulticaster
			getApplicationEventMulticaster().addApplicationListener(listener);
		}
		// 将所有 实现了 ApplicationListener bean放入 applicationListnerBean中。
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String listenerBeanName : listenerBeanNames) {
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		}
		// 由于已经注册了ApplicationListener,所以如果有 启动阶段发送的消息,那么此时就可以发送
		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
		this.earlyApplicationEvents = null;
		if (earlyEventsToProcess != null) {
			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
				getApplicationEventMulticaster().multicastEvent(earlyEvent);
			}
		}
	}

finishBeanFactoryInitialization

在这里面,beanFactory的初始化将进入尾声,则里面,Spring会对所有bean调用getBean的初始化方法。

	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 设置特定的类型转化bean
		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));
		}

		// 如果没有配置值解析器,则会使用默认的值解析器。
		if (!beanFactory.hasEmbeddedValueResolver()) {
			beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
		}

		// 初始化 代码织入类,即 字节码工具类 LoadTimeWeaverAware 
		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);

		// 保存所有bean实例快照
		beanFactory.freezeConfiguration();

		// 实例化所有bean,除了lazy属性外。并调用所有 SmartInitializingSingleton 的afterSingletonsInstantiated 方法。
		beanFactory.preInstantiateSingletons();
	}

finishRefresh

做一些refresh尾声工作,包括清楚缓存,全局发事件消息等。

	protected void finishRefresh() {
		// 清楚相关缓存
		clearResourceCaches();
		// 如果没有 LifecycleProcessor 类型bean,则初始化一个默认的 DefaultLifecycleProcessor bean
		initLifecycleProcessor();
		// 调用 上一步LifecycleProcessor 的refresh方法。
		getLifecycleProcessor().onRefresh();
		// 全局发布消息。
		publishEvent(new ContextRefreshedEvent(this));
		// 将当前ApplicationContext放入 LiveBeansView中。
		LiveBeansView.registerApplicationContext(this);
	}
  1. 清除相关缓存
  2. 如果没有 LifecycleProcessor 类型bean,则初始化一个默认的 DefaultLifecycleProcessor bean
  3. 调用 上一步LifecycleProcessor 的refresh方法。
  4. 全局发布消息。
  5. 将当前ApplicationContext放入 LiveBeansView中。
    SpringContext设计为支持多个容器,所以在 LiveBeansView 中会有 静态类型的ConfigurableApplicationContext 保存容器。

最后在finnaly块中调用 resetCommonCaches 清除一些用到的缓存,释放占用内存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章