我目前正在尝试在小应用程序中使用Google Guice-3.0。“Assisted”工厂的输出应该是@Singleton
运行此应用程序时,会提示用户输入他的姓名和密码。由于此信息直到运行时才知道,因此我使用AssistedInject
来实现我的User
实例化。
这是我的UserFactory
用武之地。它通过
User user = getInjector().getInstance(UserFactory.class).create(username, password);
提供的方法
public User create(@Assisted("Username") String username,
@Assisted("Password") String password);
的User
类是在节目开始时启动一次(在用户输入之后)User
我想在应用程序的整个生命周期中使用这个实例。我已经将范围设置为@Singleton
。
但问题是,我只能得到错误。吉斯抱怨并呼吁
User user = getInjector().getInstance(User.class);
时,我没有通过任何变量,如果我添加一个bind(User.class);
到configure
方法,发生错误,没有申报的注释@Assisted
(因为你可以把注释中参数前唯一识别它们 - 吉斯可能认为这是其中之一,需要一个依赖于设置(如
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);
}
}
谢谢,这有助于。 – Danyel 2012-08-07 15:50:08
Sry,新的Stackoverflow ... 我想补充几个问题: 由于用户有一个密码,我必须用这个密码启动UserModule构造函数并将它存储在一个字段中,然后引用它在配置方法中。如: '最终字符串用户名; final char [] password; public UserModule(String username,char [] password){ this.username = username; this.password = password; } @覆盖公共无效配置(){ 绑定(User.class).toInstance(新的用户(用户名,密码)); }' 另一个问题:为什么我不能将List绑定到LinkedList或某物?在一般的Java类中:[ – Danyel 2012-08-07 15:56:23
关于“新到SO”:没问题,值得欢迎。但你必须明白,这不是一个聊天网站。这意味着,其他用户也希望找到相关的问题来解决他们的问题。只有当不同的问题分解成不同的问题时才有可能。特别是“List”问题已经在这里被问了好几次了。关于第一个项目:重要的是'bind(User.class).toInstance(...)'你正确的事情。用户名和密码如何进入该位置并不重要。但它应该工作。 – 2012-08-07 22:13:27