15-Spring源码解析之refresh(8)——【finishBeanFactoryInitialization】

Spring版本:<version>5.2.1.RELEASE</version>

上一篇:14-Spring源码解析之refresh(7)——【onRefresh】和【registerListeners】

上一篇,我们讲解了refresh方法中调用的第9个onRefresh方法和第10个registerListeners方法。接着本篇文章讲解refresh方法调用的第11个finishBeanFactoryInitialization方法。也是Spring中最核心的方法。

一、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));
		}

		// Register a default embedded value resolver if no bean post-processor
		// (such as a PropertyPlaceholderConfigurer bean) registered any before:
		// at this point, primarily for resolution in annotation attribute values.
		// 注册默认的嵌入值解析器 
		// 如:PropertyPlaceholderConfigurer 
		if (!beanFactory.hasEmbeddedValueResolver()) {
			beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
		}

		// 根据LoadTimeWeaverAware类型,来获取LoadTimeWeaverAwareName,如果有则创建这个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);

		// Allow for caching all bean definition metadata, not expecting further changes.
		// 冻结所有的beanDefinition, 实际上就是将ArrayList类型的beanDefinition转为String类型
		beanFactory.freezeConfiguration();

//-------------------------------------加载Bean---------------------------------------------
		// Instantiate all remaining (non-lazy-init) singletons.
		// 把所有非懒加载的Bean都实例化
		beanFactory.preInstantiateSingletons();
	}

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

二、preInstantiateSingletons方法

	public void preInstantiateSingletons() throws BeansException {
		if (logger.isTraceEnabled()) {
			logger.trace("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		// 遍历副本以允许init方法注册新的beanDefinition。
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
			// 是获取缓存的BeanDefinition对象并合并其父类和本身的属性
			// BeanDfinitiaon定义公共的抽象累是AbstractBeanDefinition。
			// 普通的Bean在Spring注册BeanDefinition的时候,实例化出来的是GenericBeanDefinition
			// Spring内置的Bean在注册BeanDefinition的时候,实例化出来的是RootBeanDefinition,
			// 这时候,就要用getMergedLocalBeanDefinition将所有的BeanDefinition都转换为RootBeanDefinition
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

			// 不是抽象类&是单例&非懒加载
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				// 判断是否是工厂Bean
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						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) {
							getBean(beanName);
						}
					}
				}
				else {
//-------------------------------------核心方法--------------------------------------------
					// 普通Bean的实例化、属性注入、初始化等
					// 下一篇文章介绍
					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((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

三、总结

refresh方法调用的第11个方法finishBeanFactoryInitialization所实现的功能:

  • 【功能一】

    • 将所有BeanDefintiion的都转换为 RootBeanDefinition类型,并判断是否是工厂Bean,若是则按照工厂Bean处理
  • 【功能二】

    • 根据beanName创建所有非工厂Bean , 即调用getBean方法

下一篇文章,我们就来好好分析一下getBean方法是如何加载Bean的。

发布了397 篇原创文章 · 获赞 71 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/104718753
今日推荐