javascript
理解Spring 容器设计理念
概述
Spring是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的開源框架,書店上關(guān)于Spring的書籍汗牛充棟,網(wǎng)上相關(guān)的文章連篇累牘,其中有很多寫的很不錯的,有入門例子的,有問題解決方案的,有環(huán)境設(shè)置的,有源代碼分析的,有spring與其他開源系統(tǒng)集成的,不一而足。本文通過生活白話,不拘泥于Spring源代碼和專業(yè)術(shù)語的束縛,不拘泥于具體的實現(xiàn)細(xì)節(jié),類比介紹Spring容器的宏觀的設(shè)計理念。
Spring容器解說
Spring容器提供 Spring 框架的基本功能,是工廠模式的實現(xiàn)。換句話說,Spring就是Bean的工廠,管理Bean的生命周期。那如何來設(shè)計呢?Spring源代碼雖不說是浩如煙海,也讓人頭暈?zāi)垦?#xff0c;如下圖所示,我們讓Spring容器走下神壇,既然是面向接口編程,用接口來描述框架,不必拘泥于具體實現(xiàn)可能更清晰些。
任何的設(shè)計都是這樣,有原料,有入口,有加工,也有出口。既然Spring是Bean的容器,是Bean的工廠,那么生產(chǎn)Bean流程是:
1)????????原料:bean的配置文件
2)????????進(jìn)料:通過ResourceLoader把xml文本文件讀入
3)????????初加工:通過BeanDefinitionReader把原料加工成半成品BeanDefinition
4)????????精加工:Bean的生產(chǎn)車間BeanFactory把半成品BeanDefinition加工成Bean
5)????????入庫:成品庫SingletonRegistry保存成品Bean,及Bean的標(biāo)簽(beanId),呵呵!你也知道這就是Map的工作了
?
?
?
IOC是Sprng 核心?關(guān)鍵?
Spring容器使用控制反轉(zhuǎn) (IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開,控制反轉(zhuǎn)(IOC)模式是基于java反射的基本原理。
通常的軟件設(shè)計,肯定把IOC作為容器的核心,其他外圍的功能如bean 的Scope都是基于IOC展開,而Spring設(shè)計卻只把它放如工具類BeanUtil,這正是Spring的高明之處,雖然IOC是Spring的創(chuàng)建bean的基礎(chǔ),但創(chuàng)建一個bean需要判斷是否靜態(tài)工廠創(chuàng)建,是否有含參數(shù)的構(gòu)造方法,而這些參數(shù)也可能是其他對象的實例,創(chuàng)建bean的初始化方法等等,這些不僅僅是bean的IOC所能涵蓋的,并且在創(chuàng)建一個bean的過程中可能需要多次迭代調(diào)用IOC程序。
綜上所述,IOC雖然是Spring的創(chuàng)建Bean的基本原理,但僅是及其重要的一部分,并不是Spring容器的核心,是Spring創(chuàng)建bean的比不可少的工具。IOC是Spring容器的關(guān)鍵,而不是核心。
Interface分級設(shè)計
接口的分級設(shè)計,是針對不同的客戶給予不同級別的產(chǎn)品。不同等級的接口關(guān)注點也各有不同,就像產(chǎn)品也分為多個級別,如高級產(chǎn)品、中級產(chǎn)品、初級產(chǎn)品分別對應(yīng)于不同的客戶群,或者如同銀行的客戶渠道有銀行卡,柜臺,網(wǎng)銀,手機終端,ATM機等等。同樣接口也分為內(nèi)部接口和外部接口,就如同有些接口可能永遠(yuǎn)不被外部用戶所知,僅僅是內(nèi)部使用,就像工廠內(nèi)部多個車間之間的內(nèi)部產(chǎn)品。
org.springframework.beans.factory. BeanFactory是Spring的頂級Interface,其中只有g(shù)etBean系列,containsBean,isPrototype,isSingleton,getType等成品Bean的基本方法。
org.springframework.beans.factory. ListableBeanFactory是Factory的管理方法如containsBeanDefinition,getBeanDefinitionCount,getBeanDefinitionNames,getBeanNamesForType系列,getBeansOfType系列,ListableBeanFactory是針對BeanDefinition半成品的。
而ApplicationContext接口除了集成ListableBeanFactory接口外,還繼承了ResourcePatternResolver,HierarchicalBeanFactory,ApplicationEventPublisher,MessageSource的功能,如在資源處理(國際化處理),事件傳遞,及各應(yīng)用層之間的context實現(xiàn)。同樣是對外的接口,Spring更建議采用ApplicationContext的原因也就在這兒,ApplicationContext更像是針對VIP客戶的產(chǎn)品。
?
?
?
?
?
Interface擴展設(shè)計
?????? Spring設(shè)計是開放性的設(shè)計思路,是值得我們做架構(gòu)設(shè)計人員學(xué)習(xí)的,如下圖所示:
| com.springframework.beans.factory (淡黃色背景) | |BeanFactory |ListableBeanFactory |ConfigrableListableBeanFactory |DefaultListableBeanFactory ? | ? |
| com.springframework.context (棕紅色背景) | ApplicationContext ????????????????????????????????????????? ?ConfigrableApplicationContext????? ? | ? |
| org.springframework.context (黃色背景) | .support | AbstractApplicationContext ?????????????????????????????? AbstractRefreshableApplicationContext ?????????????????????????????? AbstractXmlApplicationContext ???????????? ??????????????????ClassPathXmlApplicationContext ? |
| org.springframework.web.context (綠色背景) | WebApplicationContext ??????????????????????????? ConfigrableWebApplicationContext | ? |
| org.springframework.web.context (淺藍(lán)色背景) | .support | AbstractRefreshableWebApplicationContext ????????????????????????????????? XmlWebApplicationContext ? |
?
?
?
?
?
總結(jié)如下:
1)??不同的包下面放不同的東西,好像是廢話啊!上層包放接口,下層包放實現(xiàn)的抽象類及實體類。如contex.support包下面放實現(xiàn)context包下面的接口的抽象類及實現(xiàn)類。
2)??為了適應(yīng)WEB級別的ApplicationContext,創(chuàng)建了WebApplicationContext的接口,該接口繼承了ApplicationContext,又添加了WEB層的個性化方法如getServletContext及屬性。現(xiàn)在終于明白了在接口間的“extends”的含義,絕對是對上層接口的“擴展“,擴展的目的是適應(yīng)更具體化的環(huán)境。就如同因為國家大,情況復(fù)雜,中央的政策相對都是比較抽象的,而地方政策必須結(jié)合地方的特色,既要滿足中央政策的要求,即實現(xiàn)中央政策的接口,又要根據(jù)本地特殊情況,擴展個性化的政策,即地方政策接口,從而更具有可操作性。
3)?在org.springframework.web.context.support.AbstractRefreshableWebAppplicationContext類是既實現(xiàn)了ConfigrableWebApplicationContext接口,即實現(xiàn)WEB的個性化特色,又繼承了org.springframework.context.support.AbstractRefreshableApplicationContext類。借助了已有的類,實現(xiàn)了架構(gòu)上的復(fù)用,這就像制定政策既要滿足地方上的特色,又可以參照其他地區(qū)現(xiàn)成的政策經(jīng)驗。呵呵!在實際工作中,也會常常有這樣的設(shè)計。
總結(jié)
以上是生活随笔為你收集整理的理解Spring 容器设计理念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静态页面通过AJAX+asp实现数据查询
- 下一篇: Docker启动报错“Job for d