spring的父子容器及配置

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。其對應(yīng)的配置文件為project-api.xml。

project-api需要對project-service里的某些方法進(jìn)行decorate,進(jìn)行裝飾,比如給CustomerService進(jìn)行裝飾。裝飾后的類為CachedCustomerService。于是,現(xiàn)在project-api里面包含兩個(gè)CustomerService,一個(gè)是來自project-service的CustomerService,另一個(gè)是CachedCustomerService。這個(gè)時(shí)候,如果project-api工程所有的配置文件都通過一個(gè)上下文進(jìn)行加載,勢必出現(xiàn)問題(通常的做法是用import標(biāo)簽全部給import進(jìn)來)。因?yàn)?,project里的PayService里通過@Resource標(biāo)準(zhǔn)注入了CustomerService,類似如下

@Serivce

public class PayService{

@Resource

private CustomerService cusService;
}

解決方式

這時(shí),由于上下文在注入customerService屬性的時(shí)候,遇到了兩個(gè)CustomService。它無法判讀注入哪個(gè)Service。

當(dāng)然了,有人會說,改一下PayService的Resource屬性,指定下具體注入哪個(gè)。但是,project-service.jar是第三方庫的話,改動代碼變得不可行,除非拿到源碼。

這個(gè)時(shí)候,就可以通過父子容器的方式解決這個(gè)問題。

將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可以看見serviceContext的效果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容