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#我的圆周率日
【推荐】 玩转可视化--来聊聊地图投影的学问
spring的父子上下文容器及配置的更多相关文章
- 【串线篇】spring boot嵌入式Servlet容器自动配置原理
EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置? @AutoConfigureOrder(Ordered.HIGHEST_PREC ...
- Spring父子上下文(WebApplicationContext)(防止事务失效)
如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的.如下 <listener> <listen ...
- Spring的父子容器问题
在ssm框架搭建的时候 配置了一个Spring容器,又配置了一个前端控制器 <!-- 初始化spring容器 --> <context-param> <param-nam ...
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
- Spring和SpringMVC父子的容器之道---[上篇]
Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会 ...
- spring的父子容器
在创建ssm项目工程时,经常需要读取properties资源配置文件,传统的方法当然可以. 但是spring提供了更简便的方法,@value注解. 在page.properties文件中,配置分页信息 ...
- Spring父子上下文的使用案例
Spring父子上下文的使用案例 一.背景 二.需求 三.实现步骤 1.基础代码编写 2.测试结果 四.小彩蛋 五.完整代码 一.背景 最近在看在使用Spring Cloud的时候发现,当我们通过Fe ...
- 配置Spring的用于初始化容器对象的监听器
<!-- 配置Spring的用于初始化容器对象的监听器 --> <listener> <listener-class>org.springframework.web ...
- [转]Spring IOC父子容器简介
通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的 ...
随机推荐
- volyaire重振Infiniband
InfiniBand简 称IB,DoSTOR存储小字典里的解释是,一种新的I/O总线技术,用于取代目前的PCI总线.IB主要应用在企业网络和数据中心,也可以应用在高速线 速路由器.交换机.大型电信设备 ...
- leetcode434
public class Solution { public int CountSegments(string s) { s = s.Trim(); ) { ; } else { ; ; ; i &l ...
- 「小程序JAVA实战」小程序视频播放的时候生命周期的控制(56)
转自:https://idig8.com/2018/09/23/xiaochengxujavashizhanxiaochengxushipinbofangdeshihoushengmingzhouqi ...
- Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件
用ant和xdoclet生成hibernate配置文件可以为我们省去很多配置的操作,废话不多说,直接给栗子: 测试环境: eclipse:Eclipse Java EE IDE for Web Dev ...
- 迷你MVVM框架 avalonjs 1.3发布
性能得到大幅改良的avalon1.3发布了. 修复$outer BUG 修复IE6-8下扫描加载Flash资源的OBJECT标签时,遇到它既没有innerHTML也没有getAttributeNode ...
- PM2 介绍
[源引]https://github.com/Unitech/pm2 pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着 ...
- 【BZOJ4154】Generating Synergy【kd树】
题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...
- 使用Log4J监控系统日志邮件警报
使用Log4J监控系统日志邮件警报 前言 在系统上线后,有时候遇到系统故障,这时候就可以登录服务器查看系统日志来排查问题.但是需要登录服务器,下载查找相关异常日志比较麻烦.而且没有监控的话,也无法实时 ...
- PCL 3维点云的模板匹配
Doc 来自PCL官方文档 http://www.pointclouds.org/documentation/tutorials/template_alignment.php#template-ali ...
- 特性(property)
6.4 特性(property) 1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circle: def ...