zoukankan      html  css  js  c++  java
  • spring的父子上下文容器及配置

    本文由作者张远道授权网易云社区发布。

    spring父子容器

    spring总的上下文容器有父子之分。父容器和子容器。父容器对子容器可见,子容器对父容器不可见。

    对于传统的spring mvc来说,spring mvc容器为子容器,也就是说ServletDispatcher对应的容器为子容器,而web.xml中通过ConextLoaderListener的contextConfigLocation属性配置的为父容器。

    使用场景

    父子容器的主要用途之一便是是上下文隔离。考虑以下一种场景。

    project-service.jar为服务层模块。包含一些数据库service方法。起对应的spring配置文件为project-service.xml。 project-api为api服务器代码。它依赖于project-service.jar。 但是,project-api需要对project-service里的某些方法进行decorate,进行装饰,比如给CustomerService进行装饰。装饰后的类为CachedCustomerService。于是,现在project-api里面包含两个CustomerService,一个是来自project-service的CustomerService,另一个是CachedCustomerService。这个时候,如果project-api工程所有的配置文件都通过一个上下文进行加载,势必出现问题。因为,project里的PayService里通过@Resource标准注入了CustomerService,类似如下

    @Serivcepublic class PayService{@Resourceprivate CustomerService cusService;
    
    }

    这时,由于上下文在注入customerService属性的时候,遇到了两个CustomService。它无法判读注入哪个Service。 当然了,有人会说,改一下PayService的Resource属性,指定下具体注入哪个。但是,project-service.jar是第三方库的话,改动代码变得不可行,除非拿到源码。

    配置父子容器

    这个时候,就可以通过父子容器的方式解决这个问题。 将project-service放在父容器中,project-api所有的bean用子容器加载。

    假设project-api的上下文配置文件为project-api.xml,实现方法如下。

    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为子容器。在apiContext扫描路径里的任务bean都对serviceContext不可见。从而达到隔离的目的

    参考列表


    更多网易技术、产品、运营经验分享请访问网易云社区

    相关文章:
    【推荐】 #3.14 Piday#我的圆周率日
    【推荐】 玩转可视化--来聊聊地图投影的学问

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/163yun/p/10102266.html
Copyright © 2011-2022 走看看