0

我刚刚开始使用 Guice 并且无法理解 guice 的注入方式。我对 Spring 非常熟悉,但这似乎有点不同。

我有一个 DAO 类:

public class SomeDAO {
    @NotNull
    private DB db = null;

    public SomeDAO (String databaseName) throws Exception{
        xxxxxxxxxxxxxxxxxxxxxxxx
    }
}

我有一个控制器,说:

public class SomeController {
    private SomeDAO someDAO;
}

我应该如何在这里使用 guice 来注入 someDAO 对象?请注意,SomeDAO 构造函数中的 databaseName 应由 SomeController 提供。

谢谢。

4

1 回答 1

4

理想情况下SomeController,不必知道数据库的名称。这将来自配置文件或您的应用程序上下文,您将像这样注入您的 DAO:

public class SomeController {
  private final SomeDAO someDAO;

  @Inject 
  SomeController(SomeDAO someDAO) {
    this.someDAO = someDAO;
  }
}

然后注入数据库名称,您可以执行以下操作:

public class SomeDAO {

  @NotNull
  private DB db = null;

  @Inject
  public SomeDAO (@IndicatesDatabaseName String databaseName) throws Exception {
    ...
  }
} 

在这种情况下,Guice 将提供databaseName(参见https://code.google.com/p/google-guice/wiki/BindingAnnotations)。如果您想为控制器提供数据库名称的知识,那么您可以考虑只从控制器中新建 DAO(但仍注入控制器)或使用辅助注入。

编辑:

如果控制器确实需要了解数据库,您可以使用辅助注入:

public class SomeController {

  private final SomeDAO someDAO;

  @Inject
  SomeController(@Assisted String databaseName) {
    this.someDAO = new SomeDAO(databaseName);
  }
}
public interface ControllerFactory {
  public SomeController create(String databaseName);
}
public static class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    install(new FactoryModuleBuilder()
    .implement(SomeController.class, SomeController.class)
    .build(ControllerFactory.class));
  }
}

ControllerFactory然后在SomeController需要的地方注入。SomeDAO如果它最终需要更多注入的依赖项,您也可以应用相同的辅助注入。

于 2013-07-03T19:34:02.383 回答