gpt4 book ai didi

java - "Assisted"工厂的输出应该是@Singleton

转载 作者:行者123 更新时间:2023-12-04 05:36:45 26 4
gpt4 key购买 nike

我目前正在尝试在一个小型应用程序中使用 Google Guice-3.0。

运行此应用程序时,系统会提示用户输入其姓名和密码。由于此信息直到运行时才知道,所以我使用 AssistedInject实现我的User实例化。

这是我的UserFactory进来。它提供了一个User用方法

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方法,发生错误,没有声明注释 @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 );
}
}

最佳答案

我不认为能得到你想要的,因为你想破坏 Guice。

Guice 希望自己管理实例及其创建。您可以使用 Provider和定制工厂,如 Assisted自己创建对象的东西——即使在 Guice 的支持下。但是您不能将这些实例反馈回 Guice。这意味着,您不能告诉 Guice 使用特定对象作为单例实例。1

可能且简单的解决方案:

  • 在创建注入(inject)器之前确定用户名并使用bindConstant()在模块中绑定(bind)用户名。在 User 中使用适当的对应项.然后你可以标记User@Singleton Guice 会尊重它。
  • 用户 bind(User.class).toInstance(myUser); .这类似于第一个提议,因为必须在 Guice 启动和运行之前获取所需的用户名。
  • 不要注入(inject) User而是一个中间对象 UserHolder (或 UserManager )这是单例。该对象具有存储实际用户和获取它的方法。您的初始化代码将获取该持有人(当时为空)并将创建的 User进入持有人。您应用程序的其他部分也将注入(inject) UserHolder .


  • 1 至少没有肮脏的把戏。

    关于java - "Assisted"工厂的输出应该是@Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838634/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com