【发布时间】:2013-04-16 06:51:21
【问题描述】:
我有一个 ear 包,其中包含一个带有通用对象的 jar 和两个我想使用通用 jar 的 war webapp。我已经将配置设置为通过 ContextLoaderListener 和 webapp 上下文分别为 DispatcherServlet 使用应用程序范围的上下文。
我的演示应用的设置大致如下
-
common.jar包含 applicationContext.xml 和 beanRefContext.xml,它们应该是应用程序(ear)范围的上下文。文件如下所示。 shared 命名空间是共享 bean 所在的位置。
applicationContext
<beans>
<!-- namespace etc declarations omitted -->
<context:annotation-config />
<context:component-scan base-package="study.spring.multicontext.shared" />
</beans>
beanRefContext.xml
<beans>
<!-- namespace etc declarations omitted -->
<bean id="sharedContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>classpath*:applicationContext.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
-
webapp1和webapp2是 Spring MVC 应用程序,使用 web.xml 文件打包为单独的战争,如下所示<web-app> <context-param> <param-name>parentContextKey</param-name> <param-value>sharedContext</param-value> </context-param> <context-param> <param-name>locatorFactorySelector</param-name> <param-value>classpath:beanRefContext.xml</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dos</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dos-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dos</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
和 xx-servlet.xml 类似 webapp 特定的上下文。 web 命名空间是控制器所在的位置。
<beans>
<!-- namespace etc declarations omitted -->
<context:component-scan base-package="study.spring.multicontext.web"/>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
</bean>
</beans>
-
共享 bean 在 Controller 类中以正常方式@Autowired
@Autowired MySharedBean mySharedBean -
ear包包含wars和jar,结构类似
ear | |--common.jar | |--META-INF | |--applicationContext.xml | |--beanRefContext.xml | |--webapp1.war | |--WEB-INF | |--xx-servlet.xml | |--web.xml | |--webapp2.war | |--WEB-INF | |--xx-servlet.xml | |--web.xml
问题是仍然会有两个 bean 实例。每个控制器/webapp 一个,因为在每场战争中只有一个控制器。我试图调整配置,但无论我做什么,我要么得到零个实例,要么得到两个实例。
我用 Eclipse MAT 从内存转储中检查了引用,实际上有 4 个实例,但我猜这两个是供 Spring 内部使用的。无论如何,从那里可以清楚地看到每个控制器都有自己的实例。
我已经阅读了许多博客文章、论坛等,他们说这应该像这样简单。有人建议使用 JNDI,但据我所知,没有它应该是可能的。
而且不可能结合战争并将罐子捆绑在里面。由于它可能适用于这个演示应用程序,但我正在使用的真实案例不允许这样做。
非常感谢您对此事的任何帮助。提前致谢。
SpringSource example from 2007 用于 Spring 2.X,其功能相同但配置不同。有点过时,正在寻找基于 Spring 3.X 的解决方案,如赏金描述中所述。
【问题讨论】:
标签: java spring spring-mvc