首页 文章

使用注释的Guice方法注入

提问于
浏览
1

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

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模块,它将根据提供的字段的类和名称绑定 SecondProcedure 中的 Table

AbstractModulebind() 方法中,我没有看到任何适合这种范式的东西 .

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

1 回答

  • 0

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

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

    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

相关问题