【问题标题】:Maven builds and dependency injection using SpringMaven 使用 Spring 构建和依赖注入
【发布时间】:2012-03-29 16:23:24
【问题描述】:

我有一个使用 Maven 管理的 Java 应用程序。该项目涉及做某事的国家的概念,例如

public interface ICountry {
    public void doSomething();
}

public class England implements ICountry {...}
public class Brazil  implements ICountry {...}

public class CountryApp {
    public static void main (String args[]) {

        ICountry country = null;

        // PSEUDOCODE:
        // Retrieve a chosen implementation of ICountry using Spring

        country.doSomething();
    }
}

根据我对Spring 的了解,我可能为每个国家/地区拥有一个Spring 配置文件。看起来可以使用Maven profiles 使用配置文件中的元素选择适当的配置文件。但是文档说配置文件旨在支持在不同环境上构建,而不是具有不同的应用程序配置。

这听起来像是一种合理的方法吗?如果有人知道更好或“更标准”的方式,请告诉我:)

编辑:最终我希望能够为每个国家/地区创建一个 .jar。例如

  • myapp-england.jar,
  • myapp-brazil.jar 等

【问题讨论】:

  • 你想测试每个国家?或者您想根据测试环境选择正确的国家/地区?
  • 您如何确定应该使用哪个Country?使用 DI 注入国家似乎有点不对劲。
  • @YMomb 最终,我希望能够为每个国家/地区创建一个 .jar。例如myapp-england.jar、myapp-brazil.jar 等。
  • @beerbajay 目前我会选择使用 Maven 配置文件的ICountry。例如mvn clean compile -P england-profile,这将选择引用 England 类的 Spring 配置。我很可能在这里误解了 Spring 的使用。
  • 你真的需要生产单独的罐子吗?您可以使用系统属性,以便最终用户可以配置要使用的 Country 类,然后您只需提供一个 jar。或者,如果每个国家/地区有很多配置,您可以为每个国家/地区设置单独的 XML 配置,然后系统属性将确定要加载其中的哪些。

标签: java spring maven


【解决方案1】:

我可以看到一些解决方案...

如果您想最终为每个国家/地区创建一个 JAR 文件,正确的方法是为每个国家/地区创建一个单独的 Maven 项目。有一个定义接口的通用项目,然后每个国家有一个单独的项目,其中包含实现类、作为依赖项的接口项目以及任何所需的附加功能或配置。这样,您可以清楚地分离各种实现,而不必担心构建设置。它也是可扩展的,如果你想添加一个新的国家,你只需要添加另一个项目——你可以安全地破坏任何现有的功能。

如果您想将其保留在一个项目中,您需要考虑何时决定使用哪个国家/地区:是在构建时,还是在运行时?使用 Maven,您将在构建时做出决定,而 Spring 是运行时决定。如果您希望能够在运行时做出决定,那么可能需要一个属性文件。尽可能通用地运行构建,不引用使用的国家,然后让用户或管理员决定在运行时使用哪个国家,例如通过提供一个属性文件,该文件引用了要使用的 Spring 上下文文件。在您的 main 方法中,您可以从类路径加载此属性文件并决定要加载哪个 Spring 上下文文件。

在这种情况下,请参考 Spring 配置中的通用 bean 名称,即确保无论您加载哪个国家/地区特定的 Spring 上下文文件,它们都包含 ID 为 country 的 bean。

【讨论】:

    【解决方案2】:

    使用配置文件,您可以运行具有不同实现的程序,指示在由 Maven 配置文件控制的变量中运行的实现。我已经在几个项目中做到了这一点,但一个代码,一个罐子。为每个实现构建不同的 jar 更加复杂。

    更好的方法是创建一个 Maven 多项目,我的意思是,一个项目只有几个 pom.xml 文件,每个文件都有自己的配置和实现。

    - Parent project 
      - common project (interfaces and common codec)
      - country 1 project (with dependency of common project)
      - country 2 project (with dependency of common project)
      - ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多