摘要:父子容器總的上下文容器有父子之分。父容器和子容器。使用場景父子容器的主要用途之一便是是上下文隔離。假設(shè)的上下文配置文件為,實(shí)現(xiàn)方法如下。說明,其中,為父容器,為子容器。
本文由作者張遠(yuǎn)道授權(quán)網(wǎng)易云社區(qū)發(fā)布。
spring父子容器
spring總的上下文容器有父子之分。父容器和子容器。父容器對子容器可見,子容器對父容器不可見。
對于傳統(tǒng)的spring mvc來說,spring mvc容器為子容器,也就是說ServletDispatcher對應(yīng)的容器為子容器,而web.xml中通過ConextLoaderListener的contextConfigLocation屬性配置的為父容器。
使用場景
父子容器的主要用途之一便是是上下文隔離??紤]以下一種場景。
project-service.jar為服務(wù)層模塊。包含一些數(shù)據(jù)庫service方法。起對應(yīng)的spring配置文件為project-service.xml。 project-api為api服務(wù)器代碼。它依賴于project-service.jar。 但是,project-api需要對project-service里的某些方法進(jìn)行decorate,進(jìn)行裝飾,比如給CustomerService進(jìn)行裝飾。裝飾后的類為CachedCustomerService。于是,現(xiàn)在project-api里面包含兩個CustomerService,一個是來自project-service的CustomerService,另一個是CachedCustomerService。這個時候,如果project-api工程所有的配置文件都通過一個上下文進(jìn)行加載,勢必出現(xiàn)問題。因?yàn)?,project里的PayService里通過@Resource標(biāo)準(zhǔn)注入了CustomerService,類似如下
@Serivcepublic class PayService{@Resourceprivate CustomerService cusService;
}
這時,由于上下文在注入customerService屬性的時候,遇到了兩個CustomService。它無法判讀注入哪個Service。 當(dāng)然了,有人會說,改一下PayService的Resource屬性,指定下具體注入哪個。但是,project-service.jar是第三方庫的話,改動代碼變得不可行,除非拿到源碼。
配置父子容器
這個時候,就可以通過父子容器的方式解決這個問題。 將project-service放在父容器中,project-api所有的bean用子容器加載。
假設(shè)project-api的上下文配置文件為project-api.xml,實(shí)現(xiàn)方法如下。
1、定義project-total.xml
classpath:project-service.xml classpath:project-api.xml
2、在web.xml的上下文配置中如下。
contextConfigLocation classpath*:project-total.xml org.springframework.web.util.Log4jConfigListener org.springframework.web.context.ContextLoaderListener
說明,其中,serviceContext為父容器,apiContext為子容器。在apiContext掃描路徑里的任務(wù)bean都對serviceContext不可見。從而達(dá)到隔離的目的
參考列表
http://springtips.blogspot.co...
http://docs.spring.io/autorep...
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營經(jīng)驗(yàn)分享請?jiān)L問網(wǎng)易云社區(qū)。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25331.html
摘要:目前建議使用與。入?yún)⑹钱?dāng)前正在處理的,是當(dāng)前的配置名,返回的對象為處理后的。如果,則將放入容器的緩存池中,并返回。和這兩個接口,一般稱它們的實(shí)現(xiàn)類為后處理器。體系結(jié)構(gòu)讓容器擁有了發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件關(guān)閉事件等。 點(diǎn)擊進(jìn)入我的博客 1 如何理解IoC 1.1 依然是KFC的案例 interface Burger { int getPrice(); } in...
摘要:現(xiàn)在給定一個項(xiàng)目的包結(jié)構(gòu)在中有以下配置只掃描注解可以看出要把最后的包寫上,不能包含子包,所以不能寫成。 大家好,我是豬弟,豬在我心中從來不是蠢的代名詞,而是懶的代名詞,本次準(zhǔn)備記錄一個在開發(fā)測試過程中遇到的問題,跟蹤了三天spring和第三方RPC組件的源碼,最終發(fā)現(xiàn)了問題是因?yàn)榈谌浇M件沒有處理好而父子容器導(dǎo)致的,還有一個因素是spring注解掃描重疊。 Spring版本:4.3...
摘要:在這一步里,將配置文件的信息裝入到容器的定義注冊表中,但此時還未初始化。注冊后處理器根據(jù)反射機(jī)制從中找出所有類型的,并將它們注冊到容器后處理器的注冊表中。是屬性編輯器的注冊表,主要作用就是注冊和保存屬性編輯器。 點(diǎn)擊進(jìn)入我的博客 1 Spring容器整體流程 1.1 ApplicationContext內(nèi)部原理 AbstractApplicationContext是Applicati...
摘要:事件事件監(jiān)聽器,對監(jiān)聽到的事件進(jìn)行處理。擁有一個成員變量,提供了容器監(jiān)聽器的注冊表。注冊事件監(jiān)聽器根據(jù)反射機(jī)制,使用的方法,從中找出所有實(shí)現(xiàn)的,將它們注冊為容器的事件監(jiān)聽器,實(shí)際的操作就是將其添加到事件廣播器所提供的監(jiān)聽器注冊表中。 1. Spring的資源抽象接口 假如有一個文件位于Web應(yīng)用的類路徑下,用戶可以通過以下方式對這個文件資源進(jìn)行訪問: 通過FileSystemReso...
摘要:服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)消費(fèi)者的不可用并將不可用逐漸放大的過程。這種代理能夠記錄最近調(diào)用發(fā)生錯誤的次數(shù),然后決定使用允許操作繼續(xù),或者立即返回錯誤。這個自己持有的上下文默認(rèn)實(shí)現(xiàn)類也是。 ?????本篇集成Hystrix,繼續(xù)搭建demo。 雪崩效應(yīng):在微服務(wù)架構(gòu)中通常會有多個服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會導(dǎo)致級聯(lián)故障,進(jìn)而造成整個系統(tǒng)不可用的情況,這種現(xiàn)象被稱為...
閱讀 1306·2021-11-23 09:51
閱讀 3421·2021-09-06 15:00
閱讀 996·2021-08-16 10:57
閱讀 1383·2019-08-30 12:46
閱讀 947·2019-08-29 12:22
閱讀 1616·2019-08-29 11:07
閱讀 3159·2019-08-26 11:23
閱讀 2993·2019-08-23 15:14