spring的父子容器及配置詳解
spring父子容器
spring總的上下文容器有父子之分,父容器和子容器。 ** 父容器對(duì)子容器可見(jiàn),子容器對(duì)父容器不可見(jiàn) ** 。
對(duì)于傳統(tǒng)的spring mvc來(lái)說(shuō),spring mvc容器為子容器,也就是說(shuō)ServletDispatcher對(duì)應(yīng)的容器為子容器,而web.xml中通過(guò)ConextLoaderListener的contextConfigLocation屬性配置的為父容器。
父子容器的使用場(chǎng)景
父子容器的主要用途是上下文隔離??紤]以下一種場(chǎng)景。
- project-service.jar為服務(wù)層模塊。包含一些數(shù)據(jù)庫(kù)service方法。其對(duì)應(yīng)的spring配置文件為project-service.xml。
- project-api為api服務(wù)器代碼。它依賴(lài)于project-service.jar。其對(duì)應(yīng)的配置文件為project-api.xml。
project-api需要對(duì)project-service里的某些方法進(jìn)行decorate,進(jìn)行裝飾,比如給CustomerService進(jìn)行裝飾。裝飾后的類(lèi)為CachedCustomerService。于是,現(xiàn)在project-api里面包含兩個(gè)CustomerService,一個(gè)是來(lái)自project-service的CustomerService,另一個(gè)是CachedCustomerService。這個(gè)時(shí)候,如果project-api工程所有的配置文件都通過(guò)一個(gè)上下文進(jìn)行加載,勢(shì)必出現(xiàn)問(wèn)題(通常的做法是用import標(biāo)簽全部給import進(jìn)來(lái))。因?yàn)?,project里的PayService里通過(guò)@Resource標(biāo)準(zhǔn)注入了CustomerService,類(lèi)似如下
@Serivce
public class PayService{
@Resource
private CustomerService cusService;
}
解決方式
這時(shí),由于上下文在注入customerService屬性的時(shí)候,遇到了兩個(gè)CustomService。它無(wú)法判讀注入哪個(gè)Service。
當(dāng)然了,有人會(huì)說(shuō),改一下PayService的Resource屬性,指定下具體注入哪個(gè)。但是,project-service.jar是第三方庫(kù)的話(huà),改動(dòng)代碼變得不可行,除非拿到源碼。
這個(gè)時(shí)候,就可以通過(guò)父子容器的方式解決這個(gè)問(wèn)題。
將project-service放在父容器中,project-api所有的bean用子容器加載。
假設(shè)project-api的上下文配置文件為project-api.xml,實(shí)現(xiàn)方法如下。
1、定義project-total.xml
<bean id = "serviceContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<value>
classpath:project-service.xml
</value>
</constructor-arg>
</bean>
<bean id = "apiContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<value>
classpath:project-api.xml
</value>
</constructor-arg>
<constructor-arg>
<ref bean="serviceContext"/>
</constructor-arg>
</bean>
2、在web.xml的上下文配置中如下。
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:project-total.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
serviceContext為父容器,apiContext為子容器,從而實(shí)現(xiàn)serviceContext看不到apiContext,而apiContext可以看見(jiàn)serviceContext的效果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用
volatile關(guān)鍵字的作用保證了變量的可見(jiàn)性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見(jiàn),避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關(guān)鍵字使用,需要的朋友可以參考下2020-03-03
解決引用jip-common jar包,報(bào)401 Unauthorized錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決引用jip-common jar包,報(bào)401 Unauthorized錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
通過(guò)實(shí)例學(xué)習(xí)JAVA對(duì)象轉(zhuǎn)成XML輸出
這篇文章主要介紹了通過(guò)實(shí)例學(xué)習(xí)JAVA對(duì)象轉(zhuǎn)成XML輸出,做流程圖的項(xiàng)目時(shí),新的流程定義為xml的,需要對(duì)xml與java對(duì)象進(jìn)行互轉(zhuǎn),下面我們來(lái)深入學(xué)習(xí),需要的朋友可以參考下2019-06-06
spring boot整合netty的實(shí)現(xiàn)方法
這篇文章主要介紹了spring boot整合netty的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
線程池中使用spring aop事務(wù)增強(qiáng)
這篇文章主要介紹了線程池中使用spring aop事務(wù)增強(qiáng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
在JDK和Eclipse下如何編寫(xiě)和運(yùn)行Java Applet
本文主要介紹了在JDK和Eclipse的環(huán)境下如何編寫(xiě)和運(yùn)行Java Applet,圖文方式,適合初學(xué)者學(xué)習(xí)。2015-09-09

