BeanFactory : 主要的方法就是getBean(StringbeanName),該方法從容器中返回特定名稱的Bean,BeanFactory 的功能通過(guò)其他的接口得到不斷擴(kuò)展。
AbstractBeanFactory : 內(nèi)部維護(hù)一個(gè)MAP 保存bean的定義.
PropertySupportBeanFactory 繼承了 AbstractBeanFactory : 職責(zé)是解析Property?
DependencyInjectionFactory :?
AbstractApplicationContext :?
ApplicationContext 由BeanFactory 派生而來(lái),提供了更多面向?qū)嶋H應(yīng)用的功能。在BeanFactory 中,很多功能需要以編程的方式實(shí)現(xiàn),而在ApplicationContext 中則可以通過(guò)配置的方式實(shí)現(xiàn)。
WebApplicationContext 是專門為Web 應(yīng)用準(zhǔn)備的,它允許從相對(duì)于Web 根目錄的路徑中裝載配置文件完成初始化工作。從WebApplicationContext 中可以獲得ServletContext 的引用,整個(gè)Web 應(yīng)用上下文對(duì)象將作為屬性放置到ServletContext 中,以便Web 應(yīng)用環(huán)境可以訪問(wèn)Spring 應(yīng)用上下文(ApplicationContext)。Spring 專門為此提供一個(gè)工具類WebApplicationContextUtils,通過(guò)該類的getWebApplicationContext(ServletContext sc)方法,即可以從ServletContext 中獲取WebApplicationContext 實(shí)例。
ClasspathXmlApplicationContext和FileSystemXmlApplicationContext的實(shí)現(xiàn)基本一致。
IOC初始化
跟蹤FileSystemXmlBeanFactory類構(gòu)造函數(shù)的代碼上,可以看到IOC容器初始化是在AbstractApplicationContext類的refresh()方法中開始的,刷新IOC可分如下幾個(gè)大步驟。
1.prepareRefresh()為初始化籌備環(huán)境,創(chuàng)建標(biāo)準(zhǔn)環(huán)境StandardEnviroment。
2.obtainFreshBeanFactory()刷新IOC容器,如果BeanFactory存在,則銷毀,再創(chuàng)建DefaultListableBeanFactory容器。這里主要是BeanDefinition解析注冊(cè)。
3.prepareBeanFactory()BeanFactory初始化,為BeanFactory添加初始化特性。
4.postProcessBeanFactory()為BeanFactory的BeanFactoryPostProcessor后置處理器,空方法空實(shí)現(xiàn),需子類實(shí)現(xiàn)。
5.invokeBeanFactoryPostProcessors()調(diào)用BeanFactory的BeanFactoryPostProcessor后置處理器。
6.registerBeanPostProcessors()給BeanFactory注冊(cè)BeanPostProcessor后置處理器。
7.initMessageSource()初始化消息源,即國(guó)際化。
8.initApplicationEventMulticaster()初始化應(yīng)用事件多路廣播實(shí)例。
9.onRefresh()初始化特殊Bean,未實(shí)現(xiàn),給子類實(shí)現(xiàn)。
10.registerListeners()注冊(cè)應(yīng)用監(jiān)聽器。
11.finishBeanFactoryInitialization()結(jié)束BeanFactory的初始化,需要饑餓加載的單例Bean是在這里初始化加載緩存的。
12.finishRefresh()完成IOC初始化,并發(fā)布對(duì)應(yīng)的事件(ContextRefreshedEvent)。
Splitter與jdk中split的比較
Splitter可以用指定的分隔符來(lái)分割給定的字符串,和Jsplit()相比,Splitter更加靈活:
1.Splitter可以支持單個(gè)字符、字符串、正則表達(dá)式或者CharMatcher實(shí)例來(lái)分割給定的字符串,而String類中的split()方法只支持用正則表達(dá)式來(lái)分割給定的字符串,用途很有限。
2.我們都知道,用正則表達(dá)式來(lái)分割字符串的效率很低,對(duì)于大量的字符串分割如果用String類中的split()方法勢(shì)必影響程序的效率,建議使用Splitter類提供的方法。
3.String類中的split()方法返回的是String數(shù)組類型,而Splitter類返回的是Iterator類型的接口,可以直接用在集合中(Lists.newArrayList(Splitter.on(‘,’).split(“a
,_b,c__”));)
4.我們還可以通過(guò)Splitter類中的trimResults()方法去掉子串中的空格,以及omitEmptyStrings()方法去掉空的子串,大大簡(jiǎn)化了用戶的使用。
5.Splitter類可以在結(jié)果中繼續(xù)分割,比如:Map
split =
Splitter.on(‘;’).trimResults().withKeyValueSeparator(“=”).split(“a=2;b=3″);直接返回Map的鍵值對(duì),這比String中的split方法強(qiáng)大多了,很值得用。