1.容器初始化過程
整個過程可以理解為容器的初始化過程。
容器的初始化是通過AbstractApplicationContext的refresh()實現的。
2.Bean的創建過程
有兩個問題
1.bean的創建時機
bean是在什么時候被創建的,有哪些規則
2.bean的創建過程
bean是怎么創建的,會選擇哪個構造函數?依賴如何注入?InitializingBean的set方法什么時候被調用?實現ApplicationContextAware,BeanFactoryAware,BeanNameAware,這些接口的bean的set方法何時被調用?
問題1 Bean的創建時機
在finishBeanFactoryInitialization()中調用preInstantiateSingletons()會完成單例對象的創建
@Override public void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("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. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); // Trigger initialization of all non-lazy singleton beans... for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName); 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 { 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(); } } } }
問題2 bean的創建過程
對於bean的創建過程其實都是通過調用工廠的getBean方法來完成的,這里面將會完成對構造函數的選擇,依賴注入等。
無論預先創建還是延遲加載都是調用getBean實現,AbstactBeanFactory定義了getBean的過程。
getBean過程很復雜,將單獨拿一篇來講。