AbstractApplicationContext#refresh

155 阅读2分钟

接着上篇的 obtainFreshBeanFactory()

ApplicationContext 相比于 BeanFactory 做的部分扩展:

  • 处理手动注册的 BeanFactoryPostProcessor、BeanPostProcessor
  • 自动注册 BeanFactoryPostProcessor、BeanPostProcessor

此处就触发了 beanFactory.getBean() ,部分Bean的创建操作

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}

@FunctionalInterface
public interface BeanFactoryPostProcessor {
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

完成接口的调用:

  • invokeBeanDefinitionRegistryPostProcessors()
  • invokeBeanFactoryPostProcessors()

invokeBeanFactoryPostProcessors(beanFactory);

// AbstractApplicationContext#invokeBeanFactoryPostProcessors

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
		// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
		// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

// PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List)

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

		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		/*
		* 先对硬编码注册 BeanFactoryPostProcessor 进行处理,硬编码是指通过 AbstractApplicationContext#addBeanFactoryPostProcessor() 手动添加的
		* */
		Set<String> processedBeans = new HashSet<>();

		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
					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.
			/*
			* 对通过配置方式注册的 BeanPostProcessor 进行处理,按照优先级顺序
			* beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class) 完成了 BeanPostProcessor 的实例化,
			* 完成接口 postProcessor.postProcessBeanDefinitionRegistry(registry); postProcessor.postProcessBeanFactory(beanFactory); 的调用
			* */
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				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);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			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);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}

			// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

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

registerBeanPostProcessors(beanFactory);

过程和 invokeBeanFactoryPostProcessors(),相似,不同是此处只是实例化并注册BeanPostProcessor,但并未对BeanPostProcessor接口中两个方法的调用

对BeanPostProcessor接口中的方法的调用发生在

  • beanFactory.getBean()->doGetBean()->createBean()

    • // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. 可在此处插手bean的实例化
    • Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  • beanFactory.getBean()->doGetBean()->createBean()-->doCreateBean()

    • applyMergedBeanDefinitionPostProcessors()
    • populateBean()
    • initializeBean()

Bean 实例化完成于

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {
	// Instantiate the bean.
	BeanWrapper instanceWrapper = null;
	// 5 创建实例,factory-method 创建实例,@Autowired有参构造函数,无参构造函数,如果此处不涉及使用引用类型的构造函数参数,实例化就完成了
	instanceWrapper = createBeanInstance(beanName, mbd, args);
	// Allow post-processors to modify the merged bean definition.
	applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
	// 解决循环依赖
	addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	
	// Initialize the bean instance.
	// 5 ioc DI,依赖注入的核心方法,根据上面注解收集到的信息,进行依赖注入
	populateBean(beanName, mbd, instanceWrapper);
	
	// bean 实例化 + ioc 依赖注入 完成之后调用
	exposedObject = initializeBean(beanName, exposedObject, mbd);
}
public interface BeanPostProcessor {
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
	
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}