我刚刚开始使用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提供。
感谢。
答案 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
应用相同的辅助注入。