Spring容器 —— 深入 bean 的載入(五、初始化 bean)

SubaYasin發表於2020-12-17

上篇分析了 bean 中屬性注入的方式,在注入了屬性之後,就需要初始化 bean 了,這部分工作完成了 bean 配置中 init-methos 屬性指定方法的內容,由 initializeBean 函式完成。

初始化流程

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			// 對特殊的 bean 處理:Aware、BeanClassLoaderAware、BeanFactory
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			// 初始化前後處理器應用
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			// 呼叫使用者配置的 init-method
			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()) {
			// 初始化後後處理器應用
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

該函式的主要功能就是對使用者自定義的 init-method 函式進行呼叫。

啟用 Aware 方法

Aware 相關的介面的主要作用是向對應的實現中注入被 Aware 的型別,如 BeanFactoryAware 就會注入 BeanFactory,同理 ApplicationContextAware 會注入 ApplicationContext。

啟用自定義 init 方法

使用者定義初始化方法除了配置 init-method 之外,還可以自定義 bean 實現 InitializingBean 介面,並在 afterPropertiesSet 中實現自己的初始化業務邏輯。init-method 和 afterPropertiesSet 都是在初始化 bean 的時候執行的,先 afterPropertiesSet 後 init-method。

相關文章