使用注释的Guice方法注入

时间:2011-12-07 11:25:34

标签: java annotations guice

我有两个Runnable类,我想在它们之间注入依赖关系,以便SecondProcedure使用Table创建的FirstProcedure运行。

class FirstProcedure implements Runnable {
    private Table composers = new Table();

    public void run() {
        // populates the composers table
    }

    public Table getComposers() {
        return composers;
    }
}


class SecondProcedure implements Runnable {
    private Table composers;

    public void run() {
        // writes the name of each composer to the console
    }

    public Table setComposers(final Table composers) {
        this.composers = composers;
    }
}

这个想法是,在我的主类中,我可以实例化两个过程,注入相关的表(即使它不会被这一点填充,也应该正确引用),计算出两者之间的依赖关系。过程,然后按正确的顺序运行它们。即,这两个程序中的每个程序都会有一个独特的实例(但我故意避免使用Singleton(反)模式,以便我可以进行适当的单元测试。)

我怎样才能使用Guice来解决这个问题? 我可以使用类似的方法注释setComposers方法:

@InjectTable(procedure=FirstProcedure.class, name="composers")
public Table setComposers(final Table composers) {
    this.composers = composers;
}

并有一个Guice模块,它会根据提供的字段的类和名称绑定Table中的SecondProcedure

我在bind()的{​​{1}}方法中看不到任何符合此范例的内容。

(除此之外,我不太热衷于这个注释本身的设计,字段的名称在字符串中,而不是以某种方式明确地引用该方法。)

1 个答案:

答案 0 :(得分:0)

我认为你可能会使问题过于复杂。

看起来SecondProcedure对表有一个简单的依赖:

class SecondProcedure {
  @Inject
  SecondProcedure(Table table) {
    this.table = table;
  } 
}

FirstProcedure是表的提供者:

class FirstProcedure implements Provider<Table> {
  public Table get() {
    return buildTheTable();
  }
}

您的模块只需要绑定提供者:

class SomeModule extends AbstractModule {
  protected void configure() {
    bind(Table.class).toProvider(FirstProcedure.class);
  }
}

@Inject带注释的构造函数的JIT绑定将提供SecondProcedure,因此您不需要显式绑定它。

完成此操作后,您可以考虑将FirstProcedure的名称更改为TableProvider。

要使用FirstProcedure,您只需注入它,或从进样器中获取它:

injector.getInstance(FirstProcedure.class).run();

另外,Guice单例模式(@Singleton范围)不是反模式,因为它仅限于注入器。有很多情况下它是合适的,Guice单例实现不会妨碍测试。

也许您应该关注的是静态。 Guice本身提供了一个很好的解释为什么它是坏的:http://code.google.com/p/google-guice/wiki/AvoidStaticState