Java,用spring配置企业应用程序和web应用程序:它们应该共享spring上下文吗?

Java,用spring配置企业应用程序和web应用程序:它们应该共享spring上下文吗?,java,spring,applicationcontext,Java,Spring,Applicationcontext,我有一个基于spring集成的事件驱动应用程序。 该应用程序由4个模块组成:域(模型对象)、持久性(daos)、核心(基于spring集成的业务逻辑)服务(MDB) 每个模块都是一个maven项目。应用程序打包在EAR中并部署在weblogic上 spring上下文在所有模块之间共享 现在我必须开发一个web应用程序来公开域的一个子集:因此我的控制器应该使用一些DAO和一些域对象。 处理此问题的最佳做法是什么?web应用程序是否应该共享所有ear spring上下文? 还是最好创建一个“特别的”

我有一个基于spring集成的事件驱动应用程序。 该应用程序由4个模块组成:域(模型对象)、持久性(daos)、核心(基于spring集成的业务逻辑)服务(MDB)

每个模块都是一个maven项目。应用程序打包在EAR中并部署在weblogic上

spring上下文在所有模块之间共享

现在我必须开发一个web应用程序来公开域的一个子集:因此我的控制器应该使用一些DAO和一些域对象。 处理此问题的最佳做法是什么?web应用程序是否应该共享所有ear spring上下文?
还是最好创建一个“特别的”web应用程序spring上下文,在这里我重新定义了我所需要的一切?(例如DAO)。

通常,您为每个DispatcherServlet创建一个特定的WebApplicationContext,在其中放置所有与web相关的内容,例如控制器、handlermapping、ViewResolver等。其余的应用程序上下文(例如服务、DAO等)配置在所有Servlet共享的根WebApplicationContext中

示例web.xml

<web-app ...>

    <!-- Definition of the root web application context and shared by all servlets -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dao-config.xml,/WEB-INF/other-config.xml</param-value>
    </context-param>

    <!-- Must be added to enable the configs above -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Servlet specific application context that inherits bean definitions from the root application context. By convention, it is located in in /WEB-INF/[servlet-name]-servlet.xml -->
    <servlet>
        <servlet-name>yourservlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>yourservlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

上下文配置位置
/WEB-INF/dao config.xml,/WEB-INF/other-config.xml
org.springframework.web.context.ContextLoaderListener
yourservlet
org.springframework.web.servlet.DispatcherServlet
1.
yourservlet
/*

向下滚动到中的图片“Spring Web MVC中的上下文层次结构”以获取概述和更多详细信息。

似乎您将受益于功能分层,例如
而不是

|- persistence (daos)
|- domain (model objects)
|- core (biz logic based on spring-integration)
|- services (MDB)
您可以以功能化的方式分层应用程序。假设您的应用程序进行交易:

|- broker
|- product
    |- underlying
    |- option
    |- future
    |- forward
    |- ..
|- feed 
|- valuation
|- ...
代理
下,您将拥有
代理持久性
代理服务
,等等。。当然,应用程序的业务领域可能不同,这是一个简单的例子,但它说明了这一点

通过这种方式,您仍然可以在
EAR
中包含所有内容,并在可以包含/导入到您的webapp中的内容上具有更大的灵活性

例如,您甚至可以创建一个与
product.war
分开的
broker.war
。这也意味着您可以重新部署
broker.war
,而无需关闭
产品.war
。在您的业务领域中,您可能不需要它,但这是一种很好的能力,只有根据业务需求/领域而不是技术堆栈分层时才能实现


顺便说一句,不需要为MDB使用EAR使事情复杂化,您可以使用Spring,它将由Spring容器简单控制。

我忘了说我想使用wicket作为web-framework.Nice。我认为这可能是在项目开始时定义的应用程序分层模型。现在,您建议的更改对我的应用程序来说非常重要。也许下一个我会考虑。这取决于你的发展阶段:当然,我明白。如果功能分层不可行,我会尝试重用现有的配置
iff
,这些配置(域、持久性、核心、服务)很小,而且您的web应用程序实际上需要大部分bean。如果你的webapp只需要几个bean,而且这些配置很大,我会在一个单独的
webish配置中复制它。除了“视情况而定”,你的问题没有一个答案。