Spring學習筆記(一)——IOC


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM