我目前正在尝试在一个小型应用程序中使用 Google Guice-3.0。
运行此应用程序时,系统会提示用户输入其姓名和密码。由于此信息直到运行时才知道,所以我使用它AssistedInject
来实现我的User
实例化。
这就是 myUserFactory
进来的地方。它提供了一个User
with 方法
public User create(@Assisted("Username") String username,
@Assisted("Password") String password);
该User
课程在程序开始时(在用户输入之后)通过
User user = getInjector().getInstance(UserFactory.class).create(username, password);
我想在应用程序的整个生命周期内使用这个实例。我已经将范围设置为@Singleton
.
问题是,但是,我只得到错误。Guice 抱怨我在调用时没有传递任何变量
User user = getInjector().getInstance( User.class );
如果我bind( User.class );
在configure
方法中添加 a ,则会发生错误,即注释没有声明@Assisted
(因为您可以将注释放在参数前面以唯一标识它们 - Guice 可能认为它是其中之一并要求设置依赖项(喜欢
bind( String.class ).annotatedWith( Assisted.class ).toInstance( username );
但这不是一件可行的事情(也许它会通过静态引用但为什么要使用 Guice?
这是您可以编译的示例。注释的代码会导致错误。特别是最后两行对我来说很烦人。
public class KSKB {
@Singleton
public static class User {
public final String name;
@Inject
public User(@Assisted("Username") String username) {
this.name = username;
}
public static interface Factory {
public User create(@Assisted("Username") String username);
}
}
public static void main(String... args) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
install(new FactoryModuleBuilder().build(User.Factory.class));
// bind( User.class );
}
});
User user = injector.getInstance(User.Factory.class).create("Guice");
System.out.println(user.name);
// user = injector.getInstance( User.class ); // doesn't work - throws Exception!!
// System.out.println( user.name );
}
}