Spring-WS服务多个WAR间共享应用上下文的实现咨询
在EAR中实现Spring-WS多个WAR共享应用上下文的方案
针对你在同一个EAR中打包10个Spring-WS WAR、需要共享应用上下文的需求,结合WebLogic环境的特性,我整理了一套实用的实现方案,核心是利用Spring的上下文层级机制,打造一个EAR级别的父上下文,让所有WAR的子上下文继承并共享其中的Bean。
核心思路
你的EAR结构里已经把共享的DAO、Service、异常类都放在了APP-INF/lib中,正好可以基于这个基础,创建一个全局的父应用上下文,将所有共享Bean定义在这里;各个WAR只需要维护自身特有的Spring-WS配置(比如端点、消息处理规则),它们的子上下文会自动继承父上下文的Bean,实现共享。
具体实现步骤
1. 配置EAR级别的父上下文
- 在EAR的
APP-INF目录下新建Spring配置文件,比如applicationContext-common.xml,把所有需要跨WAR共享的Bean(比如DAO实现、Service接口实现、异常处理器等)都定义在这个文件里。 - 修改
META-INF/weblogic-application.xml,添加Spring上下文加载器的配置,让WebLogic在启动EAR时自动加载这个父上下文:<wls:application-param> <wls:param-name>contextConfigLocation</wls:param-name> <wls:param-value>APP-INF/applicationContext-common.xml</wls:param-value> </wls:application-param> <wls:listener> <wls:listener-class>org.springframework.web.context.ContextLoaderListener</wls:listener-class> </wls:listener> - 确认
APP-INF/lib中包含Spring核心依赖包(如spring-context.jar、spring-web.jar等),保证父上下文能正常初始化。
2. 配置各个WAR的子上下文
- 每个WAR的
WEB-INF/web.xml中,只需要配置当前WAR专属的Spring-WS配置文件,不需要重复引入共享配置:<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-service1.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> - 在WAR的专属配置文件(比如
applicationContext-service1.xml)里,只定义当前服务特有的Bean(如SOAP端点、自定义消息转换器)即可。如果需要使用共享Bean,直接通过@Autowired或者XML注入即可,Spring会自动从父上下文查找对应的实例。
3. 验证共享效果
- 可以在某个WAR的端点类中注入一个父上下文里的Service Bean,编写简单的测试接口调用该Service,检查是否能正常获取实例并执行逻辑,以此验证共享是否生效。
- 注意:父上下文的Bean默认是单例模式,所有WAR会共享同一个实例。如果某个WAR需要独立的Bean实例,只需要在该WAR的配置文件中重新定义这个Bean,子上下文的定义会覆盖父上下文的配置。
关键注意事项
- 确保所有共享Bean都是线程安全的,因为它们会被多个WAR的并发请求同时访问。
- 父上下文只存放通用共享的Bean,不要加入WAR特有的配置,保持全局上下文的简洁性和通用性。
- 这套方案是针对WebLogic环境的,如果后续切换到其他应用服务器(如JBoss),配置细节会略有不同,但核心的上下文层级思路是通用的。
内容的提问来源于stack exchange,提问作者Bhaskar Varada
相关产品推荐
相关产品推荐

