【问题标题】:Java, configure enterprise application and web application with spring: should they share the spring context?Java,用spring配置企业应用程序和web应用程序:它们应该共享spring上下文吗?
【发布时间】:2011-10-03 08:35:06
【问题描述】:

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

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

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

现在我必须开发一个 web 应用程序来公开域的一个子集:所以我的控制器应该使用一些 daos 和一些域对象。 处理这个问题的最佳实践是什么? Web 应用程序是否应该共享所有耳簧上下文? 还是更好地创建一个“ad hoc”Web 应用程序 spring 上下文,在其中重新定义我需要的所有内容? (例如 daos)。

【问题讨论】:

    标签: java spring applicationcontext


    【解决方案1】:

    似乎您会从功能分层中受益,例如instead of

    |- persistence (daos)
    |- domain (model objects)
    |- core (biz logic based on spring-integration)
    |- services (MDB)
    

    您可以以实用的方式对您的应用程序进行分层。假设您的应用进行交易:

    |- broker
    |- product
        |- underlying
        |- option
        |- future
        |- forward
        |- ..
    |- feed 
    |- valuation
    |- ...
    

    broker 下,您将有broker-persistencebroker-service 等。当然,您的应用程序的业务领域可能不同,这是一个幼稚的示例,但它说明了这一点。

    通过这种方式,您仍然可以将所有内容包含在您的 EAR 中,在可以包含/导入您的 web 应用程序方面具有更大的灵活性。

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

    顺便说一句,EAR 只是用于 MDB,您可以使用 Spring 的 Message Driven POJOs,这将由 Spring 容器简单地控制。

    【讨论】:

    • 不错。我认为这可能是在项目开始时定义的应用程序分层模型。现在,您建议的更改对我的应用程序来说很重要。也许下一个我会考虑它。
    • 这取决于您的开发阶段:当然,我理解。如果功能分层不可行,那么我会尝试重用现有配置iff 那些配置(域、持久性、核心、服务)很小,而您的 Web 应用程序实际上需要大部分 bean。如果您的 web 应用程序只需要来自各处的几个 bean,并且这些配置很大,我会将其复制到单独的 webish-config 中。除了“视情况而定”之外,您的问题没有唯一的答案。
    【解决方案2】:

    通常,您会为每个 DispatcherServlet 创建一个特定的 WebApplicationContext,在其中放置所有与 Web 相关的内容,例如控制器、处理程序映射、视图解析器等。其余的应用程序上下文,例如服务、daos 等是在一个 root WebApplicationContext 中配置的,它由所有 servlet 共享。

    示例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>
    

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

    【讨论】:

    • 我忘了说我想使用 wicket 作为网络框架。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多