理想情况下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
如果它最终需要更多注入的依赖项,您也可以应用相同的辅助注入。