【问题标题】:Should each module in a Maven project have its own Spring application context?Maven 项目中的每个模块是否应该有自己的 Spring 应用程序上下文?
【发布时间】:2014-02-08 20:15:49
【问题描述】:

我正在创建一个应用程序,我将项目分隔在不同的模块中,例如(域、存储库、服务和 Web)以及许多用于邮件发送、文本格式化等的通用 maven 项目。我也在使用 Spring。

目前我只有在 web 项目中有 Spring 应用程序上下文文件。但是,由于我正在创建用于文本格式等的通用项目项目,这些项目封装了来自实际应用程序的库(例如 freemarker),我不喜欢我必须在 Web 项目的 Spring 应用程序上下文文件中指定依赖库的配置。

问题是为每个模块拥有一个单独的 Spring 应用程序上下文文件,然后在我使用它们的项目中导入上下文文件是否正确。这是正确的方法吗,还是有更好的方法?

我对使用 XML 文件而不是 JavaConfig 时如何解决这个问题感兴趣。

【问题讨论】:

  • 您应该使用JavaConfig 而不是有些过时的基于XML 的配置。对于真正的抽象,您需要查看一个 OSGI 类型布局,其中一个模块用于 API,它是编译时依赖项,一个模块用于运行时代码。您可以在代码模块中注释类,它们将被类路径扫描自动拾取。
  • 我现在无法更改为 JavaConfig。使用 XML 时该怎么做?
  • 您可以将基于 XML 的配置与注释一起使用。您定义要扫描 XML 中的注释的包,Spring 将自动获取注释。
  • @BoristheSpider 我正在使用 @Component@Repository 等注释,但有时我使用 XML 通过命名空间来激活 Spring MVC。我目前无法将该配置移至 JavaConfig。那么我应该如何组织这些 XML 文件呢?

标签: java spring maven jakarta-ee spring-mvc


【解决方案1】:

为所有模块创建applicationContext.xml 配置并将其放置在模块中,然后从网络模块导入所有模块的所有配置。

web.xml

<!-- Context Configuration locations for Spring XML files -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:/applicationContext-resources.xml
        classpath:/applicationContext-dao.xml
        classpath:/applicationContext-service.xml
        classpath*:/applicationContext.xml
        /WEB-INF/applicationContext*.xml
        /WEB-INF/cxf-servlet.xml
        /WEB-INF/security.xml
    </param-value>
</context-param>

在这个例子中,所有applicationContext.xml 都是从模块中导入的。

此示例代码是从 AppFuse 应用程序中复制的,看看这个应用程序是如何配置的。使用 AppFuse 构建示例多模块 Spring 应用程序:

mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring-archetype -DarchetypeVersion=3.0.0 -DgroupId=com.mycompany -DartifactId=myproject -DarchetypeRepository=http://oss.sonatype.org/content/repositories/appfuse

参考资料:

【讨论】:

    【解决方案2】:

    我赞同 Boris the Spider 关于基于注释的配置的评论。

    我对这个问题的解决方案是首先在模块(以及任何地方)中使用基于注释的配置。

    第二步,配置父项目组件扫描模块的包。

    最后,如果注释没有完全处理某些内容,则很可能需要仔细配置才能在父级内部工作。

    Here is a newer reference 基于注解的配置。大多数情况可以用一两个简单的注释来处理。查看@Value,它可用于从属性等设置值。

    【讨论】:

    • 我现在无法更改为 JavaConfig。使用 XML 时该怎么做?
    • 根据我的经验,过渡到注解/JavaConfig 可以顺利且渐进地完成。经过几年的开发,您几乎没有任何 XML。您可以将 xml 文件作为资源包含在模块中,并直接从父 xml 导入它们,如stackoverflow.com/a/5115384/1148030 所示,或从 web.xml 如@MariuszS 答案所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多