AbstractApplicationContext中會初始化resourcePatternResolver,默認是org.springframework.core.io.support.PathMatchingResourcePatternResolver.setConfigLocations(configLocations);
ApplicationContext初始化主要函數:
org.springframework.context.support.AbstractApplicationContext.refresh();
1. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
將形如
<bean id=”a” class=”A”>
<property name=”prop1”>value1</property>
</bean>
轉換成BeanDefinition,並存入DefaultListBeanFactory.beanDefinitionMap
並將構建好的beanFactory作為AbstractApplicationContext的屬性
2. AbstractApplicationContext.prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
其中有步操作:beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
這個ApplicationContextAwareProcessor是個BeanPostProcessor,負責注入ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware, ApplicationContextAware ApplicationContext相關特性的Bean.
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);
}
3. postProcessBeanFactory(beanFactory);
4. invokeBeanFactoryPostProcessors(beanFactory);
調用所有beanFactoryPostProcessor, BeanFactoryPostProcessor是一個接口,會處理beanfactory中的beanDefinition,實現此接口會被調用。
調用實現 PriorityOrdered接口的processor,並按priority排序調用
調用實現Ordered接口的processor,並按順序調用。
最后調用其它實現BeanFactoryProcessor.
5. registerBeanPostProcessors(beanFactory);
將bean中所有的實現BeanPostProcessor接口的bean找到
如果有,先將BeanPostProcessorChecker加入數組
取得beanfactory中所有BeanPostProcessor
將其分組實現PriorityOrdered接口的,實現Ordered的接口,剩下的。
對PrioityOrded接口的進行排序並依次加入數組,
再將Orderd的加入,最后加入剩下的
6. initMessageSource();
尋找beanName為messageSource的bean,並初始化之。如果沒有,初始化默認的。
7. initApplicationEventMulticaster();
尋找beanName為applicationEventMulticaster的bean,並初始化。如果沒有,初始化默認的.在廣播時尋找所有實現接口ApplicationListener的類。
8.onRefresh()
9. registerListeners()
注冊所有實現接口ApplicationListener接口的類。
10. finishBeanFactoryInitialization(beanFactory)
初始化所有singlton的bean
Singleton創建方法:
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(String, ObjectFactory)
化普通創建為Factory.getObject()方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])
通過合適的方法找到時候的構造函數,初始化bean.並形成一個beanwrapper,並對每個屬性進行Editor注冊
a.調用構造函數
b.注入屬性
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)
c.注入BeanFactory 感知環境的接口BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(this);
}
d.調用BeanPostProcessors
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
采用責任鏈模式調用 BeanPostProcessor.ProcessBeforeInitialization(result, beanName)
e. 如果Bean實現了InitializingBean,調用afterPropertiesSet方法。
f.如果Bean具有init-method屬性,調用init-method方法。
invokeCustomInitMethod(beanName, bean, initMethodName, mbd.isEnforceInitMethod());
g.最后調用BeanPostProcessors
applyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);
采用責任鏈模式調用BeanPostProcessor.postProcessAfterInitialization(result, beanName)