【问题标题】:Spring web app. One war multiple application context春季网络应用程序。一战多应用上下文
【发布时间】:2015-02-13 21:34:10
【问题描述】:

我搜索了一段时间,但找不到合适的解决方案。

我有一个 WAR Web 应用程序,我希望在其中运行 2 个 Spring 应用程序,一个用于 Web 部件,一个运行计划任务。 两个应用程序共享很多 bean,所以我希望这两个应用程序共享一些 bean 实例。

我想将我的上下文拆分为:
-shared-context.xml
-web-context.xml
-task-context.xml

Web-context 和 task-context 必须隔离,不能互相看到。他们需要创建一些相同但具有不同配置的 bean。

这可能吗?我该怎么做?

我首先尝试将<import resource="classpath:shared-context.xml" /> 放在 web 上下文和任务上下文中,并将我的 web.xml 配置为

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>web-context.xml task-context.xml</param-value>
</context-param>

但问题是 web 和 task 之间没有隔离。它们都共享所有的 bean,甚至是 web-context.xml 和 task-context.xml 中定义的那个

这里是我的 web.xml 文件的信息:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/web-context.xml /WEB-INF/task-context.xml</param-value>
    </context-param>

    <!-- Listeners -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.gwtrpcspring.RemoteServiceDispatcher</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>contentDownloadServlet</servlet-name>
        <servlet-class>ch.olator.servlet.MyContentDownloadServlet</servlet-class> 
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.rpc</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>contentDownloadServlet</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>

    ... some irrelevant filters ...

</web-app>

更新
-为了让事情更清楚,我需要任务和网络之间的这种隔离,因为用于运行计划任务的任务上下文定义了一些在网络上下文中但不同的bean。例如。我有 web 上下文中的作用域会话 bean,但我需要为任务定义不同的它们,因为计划任务不能使用作用域会话 bean。

【问题讨论】:

  • web.xml 中缺少的部分是什么?此外,您仍然有一个应用程序,有多少 xml 文件或上下文无关紧要。一般来说,您应该已经有 2 个上下文,一个来自 ContextLoaderListener,另一个来自 DispatcherServlet。来自ContextLoaderListener 的那个充当来自DispathcerServlet 的那个的父级。在您发布的 web.xml 中,您只有一个来自 ContextLoaderListener 的上下文,您拥有多少个 xml 文件并不重要。
  • 缺少的部分是一些不相关的 servlet 过滤器。我没有其他上下文文件,我曾经将所有内容放在同一个 web-context.xml 中(也许这不是正确的方法),尽管我希望调度程序 servlet 和 contentDownloadServlet 共享所有 bean。我不想在调度程序 servlet 和 contentDownloadServlet 之间有隔离和不同的上下文
  • 好的。但是,无论您有多少个 xml 文件,您都只有一个上下文。所以你想要的应该已经是这样了......你的文件没有加载两次,它可能会被解析两次,但那是不同的。豆子是一样的。
  • @M.Deinum 你说得对,但我更新了我的问题,因为它仍然没有做我想做的事情
  • 永远不会有分离,因为只有一个ApplicationContext。为何如此拼命想要将两者分开?在我看来,您只是想增加复杂性...

标签: java spring servlets scheduled-tasks applicationcontext


【解决方案1】:

你可以使用导入标签

在 web-context.xml 中:

<import resource="classpath:shared-context.xml" />
<import resource="classpath:task-context.xml" />

【讨论】:

  • 不,我希望将 web 和任务分开应用程序我不希望 web-context 看到在 task-context 中定义的 beans,也不希望 task-context 查看在 web-context 中定义的 beans
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2018-05-20
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多