配置类 - 使用Guice的最佳实践

时间:2011-09-16 09:03:11

标签: java configuration guice

背景:我正在使用Google Guice,因此更容易通过配置类,但我认为这不是最佳方式。

我有一个存储一些路径的配置类:

class Configuration{
   String getHomePath();
   String getUserPath();
}

我还有一个类“a”需要“homepath”和一个类“b”需要“userpath”。

通过类a和b的构造函数传递配置类或仅传递特定路径更好吗?

3 个答案:

答案 0 :(得分:3)

如果您确实正确使用Guice,那么所有这样的配置都应该出现在模块“configure方法中”。所以:

  1. 删除配置类。
  2. 创建注释类,可能称为HomePathUserPath
  3. 其中类a使用getHomePath()将其替换为名为homePath的字符串字段成员。
  4. 其中类b使用getUserPath()将其替换为名为userPath的字符串字段成员。
  5. 将类a和b构造函数修改为@Inject注释(应该已经是)并接受一个String参数,分别用@HomePath@UserPath注释并分配String字段成员注入的价值。
  6. 在模块的configure方法中创建绑定使用.annotatedWith()来定义正确的值;如果它们仅在运行时可用,则绑定提供者。
  7. E.G。

    class a {
      private String homePath;
      @Inject
      public a(@HomePath String homePath) {
        this.homePath = homePath;
      }
      public String tellMeAboutHome() {
        return "We live in a nice home called " + homePath;
      }
    }
    
    class customModule extends AbstractModule {
      public static final String userPath = "/home/rafael";
    
      public void configure() {
        bind(String.class).annotatedWith(HomePath.class).to("/home/");
        bind(String.class).annotatedWith(UserPath.class).to(userPath);
      }
    }
    

    如果创建注释对您来说太多了,请使用@Named注释Guice ships with

答案 1 :(得分:1)

一般规则是使依赖图(哪些类知道或依赖于其他类/接口)尽可能简单,规则和固定的代码。

如果没有传递Configuration类使得a或b对用户编写的类没有依赖关系,或者为了避免依赖循环,则需要使用各个路径字符串。否则,如果更有意义地说'此类可以访问配置信息,以某种可能在将来发生变化的方式',则传递该类。

我会避免使用单例方法,特别是如果你已经设置了Guice。

答案 2 :(得分:1)

您的问题没有单一的答案,根据您的具体情况,只有可供选择的选项。

如果您知道Configuration课程会增长 AND ,如果您的AB课程可能会使用更多内容,那么通过整个Configuration对象给它们的构造函数。注意:我知道这违反了YAGNI原则,但有时你可能知道你会需要它; - )

否则,您可以考虑使用@Named注入路径,以便将AB类依赖项降低到最小值,这是一个很好的设计实践。