Spring 源碼(五)初始化所有單例Bean,並註冊到容器(Bean的生命週期)

在這之前我們先來看下refresh()方法,它完整的描述了整個ApplicationContext的初始化過程。這裏看起來更像是對容器進行初始化的模板或者提綱。

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// Prepare this context for refreshing.
		// 初始化容器前的預處理
		prepareRefresh();

		// Tell the subclass to refresh the internal bean factory.
		// 告訴子類刷新容器
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// Prepare the bean factory for use in this context.
		// BeanFactory的預準備工作(設置ClassLoader、表達式解析器等)
		prepareBeanFactory(beanFactory);

		try {
			// Allows post-processing of the bean factory in context subclasses.
			// 註冊BeanFactory的後置處理器
			postProcessBeanFactory(beanFactory);

			// Invoke factory processors registered as beans in the context.
			// 執行BeanFactory 的後置處理器(包括解析配置類,加載業務Bean的定義到容器)
			invokeBeanFactoryPostProcessors(beanFactory);

			// Register bean processors that intercept bean creation.
			// 註冊Bean的後置處理器,在Bean的創建和初始化過程中調用
			registerBeanPostProcessors(beanFactory);

			// Initialize message source for this context.
			// 初始化上下文中的消息
			initMessageSource();

			// Initialize event multicaster for this context.
			// 初始化上下文中的事件機制
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			// 初始化其他特殊Bean
			onRefresh();

			// Check for listener beans and register them.
			// 檢查監聽Bean並且將這些Bean向容器註冊
			registerListeners();

			// Instantiate all remaining (non-lazy-init) singletons.
			// 實例化所有的單例且爲非懶加載的Bean,並向容器註冊這些Bean(包括業務Bean)
			finishBeanFactoryInitialization(beanFactory);

			// Last step: publish corresponding event.、
			// 發佈容器事件,結束refresh過程
			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資源佔用,在異常處理中,銷燬已經砸前面生成的Bean
			destroyBeans();

			// Reset 'active' flag.
			// 重置 'active' 標誌
			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();
		}
	}
}
  • registerBeanPostProcessors():完成了所有後置處理器 BeanPostProcessor 的實例化,並註冊到容器。
  • finishBeanFactoryInitialization(beanFactory);:方法完成了對所有業務單例Bean的初始化,並註冊到容器。

registerBeanPostProcessors 註冊所有後置處理器

調用鏈路:

registerBeanPostProcessors:188, PostProcessorRegistrationDelegate (org.springframework.context.support)
registerBeanPostProcessors:703, AbstractApplicationContext (org.springframework.context.support)
refresh:528, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

// 完成了所有後置處理器 BeanPostProcessor 的實例化,並註冊到容器。
public static void registerBeanPostProcessors(
		ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
	
	// 從容器中找出所有的後置處理器的名稱
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

	// Register BeanPostProcessorChecker that logs an info message when
	// a bean is created during BeanPostProcessor instantiation, i.e. when
	// a bean is not eligible for getting processed by all BeanPostProcessors.
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// Separate between BeanPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
	List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
	List<String> orderedPostProcessorNames = new ArrayList<String>();
	List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
	// 對後置處理器進行分類 分爲PriorityOrdered、Ordered和regular三類
	for (String ppName : postProcessorNames) {
		// PriorityOrdered 類
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			// 完成後置處理器的實例化
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			priorityOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// Order 類
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		// nonOrdered類
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// 首先將實現PriorityOrdered接口的BeanPostProcessors註冊到容器
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

	// 其次將實現Ordered接口的BeanPostProcessors實例化並註冊到容器
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
	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);

	// 再次將常規的BeanPostProcessors實例化並註冊到容器
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
	for (String ppName : nonOrderedPostProcessorNames) {
		// 完成後置處理器的實例化
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		nonOrderedPostProcessors.add(pp);
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

	// 最後從新將所有內部的BeanPostProcessors註冊到容器
	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後置處理器
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

執行過程:

  1. 從容器中找出所有的後置處理器的名稱
  2. 對後置處理器進行分類,分爲PriorityOrdered、Ordered和regular三類
  3. 將實現PriorityOrdered接口的BeanPostProcessors實例化並註冊到容器
  4. 將實現Ordered接口的BeanPostProcessors實例化並註冊到容器
  5. 將常規的BeanPostProcessors實例化並註冊到容器
  6. 從新將所有內部的BeanPostProcessors註冊到容器
  7. 重新註冊ApplicationListenerDetector後置處理器

PriorityOrdered繼承自Ordered,但是並沒有任何的增強。PriorityOrdered僅僅是一個標誌,從上面的源代碼我們可以看出,不管getOrder()返回值的大小,PriorityOrdered的優先級始終高於Ordered。

finishBeanFactoryInitialization() 註冊所有業務Bean

調用鏈路:

finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() 創建Bean的前置處理方法

InstantiationAwareBeanPostProcessor:這個後置處理器主要運行在在實例化Bean的前後,主要作用是對Bean的實例化進行擴展處理。

實例化之前調用 postProcessBeforeInstantiation() 方法,調用鏈路:

postProcessBeforeInstantiation:20, InitBeanInstantiationAwareBeanPostProcessor (com.xiaolyuh.init.destory)
applyBeanPostProcessorsBeforeInstantiation:1045, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
resolveBeforeInstantiation:1019, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:473, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
	...
	try {
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		// 調用創建bean的前置方法 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		if (bean != null) {
			return bean;
		}
	}
	...
	// 創建Bean實例並放到容器中
	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
	return beanInstance;
}

// 調用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()方法
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
	for (BeanPostProcessor bp : getBeanPostProcessors()) {
		if (bp instanceof InstantiationAwareBeanPostProcessor) {
			InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
			Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
			if (result != null) {
				return result;
			}
		}
	}
	return null;
}

doCreateBean() 創建Bean

調用鏈路:

doCreateBean:513, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
		throws BeanCreationException {

	// 實例化Bean
	BeanWrapper instanceWrapper = null;
	...
	if (instanceWrapper == null) {
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	...

	// 執行MergedBeanDefinitionPostProcessor後置處理器,運行時合併bean的定義(RootBeanDefinition)。
	// 比如處理@Autowired、@Resource、@Vaule等註解
	synchronized (mbd.postProcessingLock) {
		...
		applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
		...
	}

	...

	// 初始化Bean實例
	Object exposedObject = bean;
	try {
		// 設置屬性值
		populateBean(beanName, mbd, instanceWrapper);
		if (exposedObject != null) {
			// 初始化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);
		}
	}

	...

	// Register bean as disposable.
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
	...

	return exposedObject;
}

創建Bean的過程:

  1. 實例化Bean
  2. 執行MergedBeanDefinitionPostProcessor後置處理器
  3. 設置屬性值
  4. 初始化Bean實例

createBeanInstance() 實例化Bean

調用鏈路:

createBeanInstance:1069, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:513, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
	...
	// 確定是否需要調用特定構造函數
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	if (ctors != null ||
			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
			mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
		// 調用特定構造函數
		return autowireConstructor(beanName, mbd, ctors, args);
	}

	// 調用無參構造函數
	return instantiateBean(beanName, mbd);
}

// 反射調用無參構造函數創建實例
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
	try {
		Object beanInstance;
		final BeanFactory parent = this;
		...
		else {
			// 通過反射創建實例
			beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
		}
		// 將實例包裝成 BeanWrapper
		BeanWrapper bw = new BeanWrapperImpl(beanInstance);
		initBeanWrapper(bw);
		return bw;
	}
	...
}

執行MergedBeanDefinitionPostProcessor後置處理器

MergedBeanDefinitionPostProcessor:他主要作用就是對Bean的定義進行合併,如解析Bean中的@Autowired@Resource@Vaule等註解,並將其封裝成成InjectedElement,如 AutowiredFieldElementAutowiredMethodElementResourceElement等。最後合併元數據信息到RootBeanDefinition.externallyManagedConfigMembers上。

postProcessMergedBeanDefinition:298, CommonAnnotationBeanPostProcessor (org.springframework.context.annotation)
applyMergedBeanDefinitionPostProcessors:1000, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:523, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
	super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
	if (beanType != null) {
		// 找到元數據信息
		InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
		// 校驗併合並元數據信息
		metadata.checkConfigMembers(beanDefinition);
	}
}

// checkConfigMembers:70, InjectionMetadata (org.springframework.beans.factory.annotation)
public void checkConfigMembers(RootBeanDefinition beanDefinition) {
	Set<InjectedElement> checkedElements = new LinkedHashSet<InjectedElement>(this.injectedElements.size());
	for (InjectedElement element : this.injectedElements) {
		Member member = element.getMember();
		if (!beanDefinition.isExternallyManagedConfigMember(member)) {
			// 合併元數據信息
			beanDefinition.registerExternallyManagedConfigMember(member);
			checkedElements.add(element);
			if (logger.isDebugEnabled()) {
				logger.debug("Registered injected element on class [" + this.targetClass.getName() + "]: " + element);
			}
		}
	}
	this.checkedElements = checkedElements;
}

populateBean() 設置屬性值

這其實就是@Autowired註解對應後置處理器AutowiredAnnotationBeanPostProcessor的執行流程。而主要起作用的是InstantiationAwareBeanPostProcessor後置處理器,這裏會先調用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()方法,再調用InstantiationAwareBeanPostProcessor.postProcessPropertyValues()方法。在InstantiationAwareBeanPostProcessor.postProcessPropertyValues()方法中我們會將屬性的值通過反射設置進去,下面是調用鏈路:

populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
	PropertyValues pvs = mbd.getPropertyValues();
	...
	// 執行InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				// 如果該方法返回false,那麼會阻斷後面後置處理器的執行。
				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
					continueWithPropertyPopulation = false;
					break;
				}
			}
		}
	}
	// 阻斷後面後置處理器的執行。
	if (!continueWithPropertyPopulation) {
		return;
	}

	...
	if (hasInstAwareBpps || needsDepCheck) {
		PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
		if (hasInstAwareBpps) {
			// 執行InstantiationAwareBeanPostProcessor.postProcessPropertyValues 使用反射給屬性賦值
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
					if (pvs == null) {
						return;
					}
				}
			}
		}
		if (needsDepCheck) {
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}
	}

	applyPropertyValues(beanName, mbd, bw, pvs);
}

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation ()

調用鏈路:

postProcessAfterInstantiation:308, CommonAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)

源碼:

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
	return true;
}

postProcessAfterInstantiation 如果該方法返回false,那麼會阻斷後面後置處理器的執行。

InstantiationAwareBeanPostProcessor.postProcessPropertyValues()

在這個方法中我們會將屬性的值通過反射設置進去,調用鏈路:

resolveCandidate:208, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1066, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:585, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:88, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessPropertyValues:366, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)

源碼:

@Override
public PropertyValues postProcessPropertyValues(
		PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
	
	// 找到需要自動裝配的元數據
	InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
	try {
		// 使用反射填充Bean
		metadata.inject(bean, beanName, pvs);
	}
	catch (BeanCreationException ex) {
		throw ex;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
	}
	return pvs;
}

@Override
protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
	Field field = (Field) this.member;
	Object value;
	...
	try {
		// 獲取屬性值,如果設置也是Bean,那麼會調用beanFactory.getBean(beanName, requiredType);方法,調用鏈路:
		// resolveCandidate:208, DependencyDescriptor (org.springframework.beans.factory.config)
		// doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
		// resolveDependency:1066, DefaultListableBeanFactory (org.springframework.beans.factory.support)
		// inject:585, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
		value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
	}
	...
		
	if (value != null) {
		// 設置屬性值
		ReflectionUtils.makeAccessible(field);
		field.set(bean, value);
	}
}

initializeBean() 初始化實例

初始化主要分爲四步:

  1. 執行部分Spring Awar方法
  2. 執行BeanPostProcessors後置處理器的postProcessBeforeInitialization方法
  3. 執行自定義的初始化Bean方法,afterPropertiesSet()-> @Bean 註解的 initMethod 方法
  4. 執行BeanPostProcessors後置處理器的postProcessAfterInitialization方法

調用鏈路:

initializeBean:1621, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
invokeBeanFactoryPostProcessors:86, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:687, AbstractApplicationContext (org.springframework.context.support)
refresh:525, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
	...
	// 執行部分Spring Awar方法
	invokeAwareMethods(beanName, bean);

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		// 執行BeanPostProcessors後置處理器的postProcessBeforeInitialization方法
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		// 執行自定義的初始化Bean方法,afterPropertiesSet()-> @Bean 註解的 initMethod 方法
		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()) {
		// 執行BeanPostProcessors後置處理器的postProcessAfterInitialization方法
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
	return wrappedBean;
}

invokeAwareMethods() 執行部分Spring Awar方法

調用鏈路:

invokeAwareMethods:1644, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1621, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)

源碼:

private void invokeAwareMethods(final String beanName, final Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof BeanNameAware) {
			((BeanNameAware) bean).setBeanName(beanName);
		}
		if (bean instanceof BeanClassLoaderAware) {
			((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
		}
		if (bean instanceof BeanFactoryAware) {
			((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
		}
	}
}
  1. 先判斷是否是實現了Aware接口
  2. 在判斷具體實現了那個Aware接口
  3. 根據具體實現的Aware調用對應回調方法

BeanPostProcessors.postProcessBeforeInitialization() 後置處理器的前置方法執行

調用鏈路:

applyBeanPostProcessorsBeforeInitialization:407, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1626, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)

源碼:

@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
		throws BeansException {

	Object result = existingBean;
	for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
		result = beanProcessor.postProcessBeforeInitialization(result, beanName);
		if (result == null) {
			return result;
		}
	}
	return result;
}

獲取到所有BeanPostProcessors後置處理器,循環執行其postProcessBeforeInitialization方法,我們在上面說過BeanPostProcessors是有順序的。

這裏我們重點看ApplicationContextAwareProcessor和InitDestroyAnnotationBeanPostProcessor兩個後置處理器postProcessBeforeInitialization方法的代碼。

  • ApplicationContextAwareProcessor主要實現了Spring Aware,上面invokeAwareMethods()方法執行力一部分Spring Aware的方法,剩下的Aware主要就是用ApplicationContextAwareProcessor來實現的。
  • InitDestroyAnnotationBeanPostProcessor主要是實現了Bean的@PostConstruct和@PreDestroy方法。
ApplicationContextAwareProcessor.postProcessBeforeInitialization() 後置處理器的執行
@Override
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
	...
	invokeAwareInterfaces(bean);
	...
	return bean;
}

//   判斷Bean是實現的那個Aware接口,然後調用對應的感知方法。
private void invokeAwareInterfaces(Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof EnvironmentAware) {
			((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
		}
		if (bean instanceof EmbeddedValueResolverAware) {
			((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
		}
		if (bean instanceof ResourceLoaderAware) {
			((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
		}
		if (bean instanceof ApplicationEventPublisherAware) {
			((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
		}
		if (bean instanceof MessageSourceAware) {
			((MessageSourceAware) bean).setMessageSource(this.applicationContext);
		}
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}
}
  1. 先判斷是否是實現了Aware接口
  2. 在判斷具體實現了那個Aware接口
  3. 根據具體實現的Aware調用對應回調方法

Aware的執行順序:

  1. BeanNameAware
  2. BeanClassLoaderAware
  3. BeanFactoryAware
  4. EnvironmentAware
  5. EmbeddedValueResolverAware
  6. ResourceLoaderAware
  7. ApplicationEventPublisherAware
  8. MessageSourceAware
  9. ApplicationContextAware
InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization() 後置處理器的執行

調用鏈路:

postConstructstroy:51, InitBeanAndDestroyBean (com.xiaolyuh.init.destory)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invoke:366, InitDestroyAnnotationBeanPostProcessor$LifecycleElement (org.springframework.beans.factory.annotation)
invokeInitMethods:311, InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata (org.springframework.beans.factory.annotation)
postProcessBeforeInitialization:134, InitDestroyAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
applyBeanPostProcessorsBeforeInitialization:409, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1626, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)

源碼:

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
	LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());
	// 執行初始化方法
	metadata.invokeInitMethods(bean, beanName);
	...
	return bean;
}

// 執行@PostConstruct方法
public void invokeInitMethods(Object target, String beanName) throws Throwable {
	Collection<LifecycleElement> initMethodsToIterate =
			(this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods);
	if (!initMethodsToIterate.isEmpty()) {
		boolean debug = logger.isDebugEnabled();
		for (LifecycleElement element : initMethodsToIterate) {
			// 通過反射調用@PostConstruct方法
			element.invoke(target);
		}
	}
}
  1. 先通過findLifecycleMetadata方法找到被@PostConstruct註解的元數據
  2. 通過反射調用@PostConstruct方法

invokeInitMethods() 執行自定義的初始化Bean方法

執行自定義的初始化Bean方法,執行順序是afterPropertiesSet() -> @Bean 註解的 initMethod 方法。
調用鏈路:

invokeInitMethods:1673, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1630, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
invokeBeanFactoryPostProcessors:86, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:687, AbstractApplicationContext (org.springframework.context.support)
refresh:525, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
		throws Throwable {

	// 先判斷是否實現了InitializingBean接口,如果是則調用afterPropertiesSet方法
	boolean isInitializingBean = (bean instanceof InitializingBean);
	if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
		if (logger.isDebugEnabled()) {
			logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
		}
		if (System.getSecurityManager() != null) {
			try {
				AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
					@Override
					public Object run() throws Exception {
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}
				}, getAccessControlContext());
			}
			catch (PrivilegedActionException pae) {
				throw pae.getException();
			}
		}
		else {
			((InitializingBean) bean).afterPropertiesSet();
		}
	}
	// 判斷聲明Bean時是否配置了initMethod方法,如果配置了則使用反射調用該方法
	if (mbd != null) {
		String initMethodName = mbd.getInitMethodName();
		if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
				!mbd.isExternallyManagedInitMethod(initMethodName)) {
			invokeCustomInitMethod(beanName, bean, mbd);
		}
	}
}
  1. 先判斷是否實現了InitializingBean接口,如果是則調用afterPropertiesSet方法
  2. 判斷聲明Bean時是否配置了initMethod方法,如果配置了則使用反射調用該方法

BeanPostProcessors.postProcessAfterInitialization() 後置處理器的後置方法執行

調用鏈路:

postProcessAfterInitialization:296, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsAfterInitialization:423, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1638, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:543, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)

源碼:

@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
		throws BeansException {

	Object result = existingBean;
	// 獲取所有後置處理器,然後調用其postProcessAfterInitialization方法
	for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
		result = beanProcessor.postProcessAfterInitialization(result, beanName);
		if (result == null) {
			return result;
		}
	}
	return result;
}
  • AnnotationAwareAspectJAutoProxyCreator:AOP代理的後置處理器,AOP生成代理的地方就是在後置處理器的postProcessAfterInitialization方法中實現的。
發佈了204 篇原創文章 · 獲贊 153 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章