读spring源码(一)-ClassPathXmlApplicationContext-初始化
工作來幾乎所有的項(xiàng)目都用到了spring,卻一直沒有系統(tǒng)的讀下源碼,從頭開始系統(tǒng)的讀下吧,分章也不那么明確,讀到哪里記到哪里,僅僅作為個(gè)筆記吧。
先看ClassPathXmlApplicationContext的類圖
有人說:BeanFactory是Spring的心臟,ApplicationContext就是完整的軀體。ApplicationContext繼承了BeanFactory,ResourceLoader提供了類的管理以及資源的加載,同時(shí)又繼承了EnvironmentCapable,MessageSource, ApplicationEventPublisher等,將環(huán)境、消息、事件等統(tǒng)一管理,真是的算上一個(gè)完整的軀干了。
簡單使用:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/test-spring.xml");User user = context.getBean(User.class);System.out.println(user.getId());?ApplicationContext的初始化時(shí)序圖如下:
1、super(parent)調(diào)用父類構(gòu)造函數(shù),在AbstractApplicationContext中會初始化resourcePatternResolver。
2、setConfigLocations(configLocations)解析spring的配置文件地址,設(shè)置到configLocations。
3、refresh()這是ApplicationContext初始化的核心,會在這里初始化BeanFactory,解析XML加載BeanDefinition,注冊bean處理器,注冊事件添加監(jiān)聽等
3.1 prepareRefresh(),初始化基礎(chǔ)屬性值3.2 obtainFreshBeanFactory(),這里會再執(zhí)行refreshBeanFactory時(shí)候創(chuàng)建一個(gè)默認(rèn)的BeanFactory:DefaultListableBeanFactory,并加載BeanDefinition。 加載BeanDefinition是會創(chuàng)建一個(gè)XmlBeanDefinitionReader對象,交由XmlBeanDefinitionReader去進(jìn)行加載。這里處理的比較復(fù)雜后面單獨(dú)分析下XmlBeanDefinitionReader。
3.3 prepareBeanFactory(beanFactory),為beanFactory設(shè)置一些屬性如ClassLoader,BeanExpressionResolver,PropertyEditorRegistrar,BeanPostProcessor等
3.4 invokeBeanFactoryPostProcessors(beanFactory),為beanFactory注冊BeanFactoryPostProcessor
3.5 registerBeanPostProcessors(beanFactory),注冊當(dāng)Bean創(chuàng)建時(shí)候的BeanPostProcessor
3.6 initMessageSource()初始化上下文的消息源:DelegatingMessageSource
3.7 initApplicationEventMulticaster()初始化了一個(gè)事件傳播器:SimpleApplicationEventMulticaster
3.8 registerListeners()獲取ApplicationListener,并在事件傳播器中注冊他們
3.9 finishBeanFactoryInitialization(beanFactory),獲取LoadTimeWeaverAware并初始化他們,初始化單例并且非懶加載的Bean
3.10 finishRefresh()完成refresh Context操作,初始化LifecycleProcessor并start,發(fā)布ContextRefreshedEvent事件
3.11 resetCommonCaches()主要是清理緩存
一個(gè)ClassPathXmlApplicationContext的初始化過程基本如上,詳細(xì)的BeanDefinition加載過程,獲取Bean操作后續(xù)再寫吧。
轉(zhuǎn)載于:https://www.cnblogs.com/lcxdever/p/9281140.html
總結(jié)
以上是生活随笔為你收集整理的读spring源码(一)-ClassPathXmlApplicationContext-初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android入门学习-天气预报app(
- 下一篇: 05-session-会话跟踪技术