Spring容器 —— 深入 bean 的載入(五、初始化 bean)
上篇分析了 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。
相關文章
- Spring Bean容器SpringBean
- Spring原始碼之Bean的載入(五) populateBean 和 DisposableBeanSpring原始碼Bean
- 深入理解Spring系列之六:bean初始化SpringBean
- Spring IoC bean 的初始化SpringBean
- Spring Bean如何初始化的SpringBean
- Spring IOC與Bean容器SpringBean
- Spring——4. Bean的載入(二)SpringBean
- Spring 原始碼(17)Spring Bean的建立過程(8)Bean的初始化Spring原始碼Bean
- Spring原始碼之Bean的載入(四)Spring原始碼Bean
- Spring原始碼之Bean的載入(二)Spring原始碼Bean
- Spring原始碼之Bean的載入(三)Spring原始碼Bean
- Spring原始碼之Bean的載入(一)Spring原始碼Bean
- Spring如何控制Bean的載入順序SpringBean
- spring-IOC容器原始碼分析(一)bean初始化流程Spring原始碼Bean
- spring原始碼閱讀筆記08:bean載入之建立beanSpring原始碼筆記Bean
- spring bean定義與載入方式SpringBean
- spring註解@lazy,bean懶載入SpringBean
- 【spring原始碼學習】spring的IOC容器在初始化bean過程Spring原始碼Bean
- SpringIOC二—— 容器 和 Bean的深入理解SpringBean
- 如何讓 Bean 深度感知 Spring 容器BeanSpring
- Spring IOC 一——Spring容器裝配BeanSpringBean
- 多重載入Bean方式Bean
- 【Spring原始碼分析】非懶載入的單例Bean初始化過程(下篇)Spring原始碼單例Bean
- 【Spring原始碼分析】非懶載入的單例Bean初始化過程(上篇)Spring原始碼單例Bean
- Spring中Bean及@Bean的理解SpringBean
- 【spring原始碼系列】之【Bean的初始化】Spring原始碼Bean
- Spring解密 – Bean的載入流程Spring解密Bean
- 徹底搞懂Bean載入Bean
- 4_Spring Bean的初始化和銷燬SpringBean
- 死磕Spring之IoC篇 - 開啟 Bean 的載入SpringBean
- Spring Bean Scope 有狀態的Bean和無狀態的BeanSpringBean
- [Spring]BeanSpringBean
- Spring原始碼:Bean生命週期(五)Spring原始碼Bean
- Spring裝配Bean(六)Bean的作用域SpringBean
- 你說,怎麼把Bean塞到Spring容器?BeanSpring
- 探索Spring系列(一)Spring容器和Bean的生命週期SpringBean
- Spring(十二):IOC容器中Bean的生命週期方法SpringBean
- spring原始碼深度解析— IOC 之 bean 的初始化Spring原始碼Bean