使用Guice 3.0注入对象

时间:2013-07-03 18:16:03

标签: java dependency-injection inversion-of-control guice inject

我刚刚开始使用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注入一些DAO对象?请注意,SomeDAO构造函数中的databaseName应该由SomeController提供。

感谢。

1 个答案:

答案 0 :(得分: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应用相同的辅助注入。