当前位置: 首页 > 知识库问答 >
问题:

吉斯辅助注射,绑定顺序

酆俊远
2023-03-14

我在实施辅助注射时遇到了错误。

辅助注射一直有效,直到我引入了另一个名为管理器的类,它依赖于辅助人员类。经理想要使用人员(@Assited地址)。代码在构建喷油器图时中断。它没有更进一步。

Injector injector = Guice.createInjector(myModule); 

直觉上,我理解当对象A得到帮助时,那么B(依赖于A)实际上也通过A得到了隐含的帮助。

请注意,我检查过了。我想像ColinD这样的人肯定知道答案如何使用Guice的AssistedInject?如何将辅助注入类绑定到接口?

出于好奇,有没有好的技术/工具来发现Guice配置错误并缓解学习曲线?我打开了ProvisionListener并使用了图形库。这有点帮助。

public class Person implements PersonInterface {
private String name;
private Address address;

 @Inject
 public Person(String name, @Assisted Address address) {
        this.name = name;
        this.address = address;
 }

}

public interface PersonInterface {
  public String getName();
  public Address getAddress();
}

public interface PersonFactory {
  public PersonInterface create(Address address);
}

public class Address {
 private final String address;  

 public Address(String address) {
    super();
    this.address = address;
 }
}

public class Manager implements IManager {  
 private final Person person;   
 @Inject
 public Manager(Person person) {
    this.person=person;
 }
 ...
 }

 configure() {

    install(new FactoryModuleBuilder()
             .implement(PersonInterface.class, Person.class)
             .build(PersonFactory.class));

    //
    bind(IManager.class).to(Manager.class);
}

实际误差为

com.google.inject.CreationException: Unable to create injector, see the following errors:

1) No implementation for ...assisted_inject.Address annotated with @com.google.inject.assistedinject.Assisted(value=) was bound.
  while locating ....assisted_inject.Address annotated with @com.google.inject.assistedinject.Assisted(value=)
    for parameter 2 at ....assisted_inject.Person.<init>(Person.java:13)

共有1个答案

傅志文
2023-03-14

将此绑定放入模块时:

bind(IManager.class).to(Manager.class);

Guice将尝试创建Manager类的新实例。它查找一个(但只有一个)用<code>@Inject</code>注释的构造函数或一个非私有的回退零参数构造函数。这是Guice将使用的构造函数:

@Inject
public Manager(Person person) {
   this.person=person;
}

现在,按照同样的规则,Guice将尝试通过使用适当的构造函数实例化Person,它将被困在这里:

@Inject
public Person(String name, @Assisted Address address) {
    this.name = name;
    this.address = address;
}

当试图实例化地址时,它会因为@辅助注释而放弃。这个注释是一个BindingAnno的,Guice特别对待这些——它试图为它们找到显式绑定,但没有。阅读绑定注释,你会明白为什么。

由于您的经理是有状态的,并且显然管理一个人,因此您可能希望为这些经理创建一个工厂,例如:

public interface IManagerFactory {
    public IManager getIManager(PersonInterface p);
}

然后你会有一个IManager,例如:

public interface IManager {
    public String getPersonName();
}

以及使用辅助注射的实现:

public class Manager implements IManager {
    private final PersonInterface person;

    @Inject
    public Manager(@Assisted PersonInterface person) {
        this.person = person;
    }

    @Override
    public String getPersonName() {
        return person.getName();
    }

}

您可以在模块中绑定这些:

class MyModule extends AbstractModule {
     protected void configure() {
        install(new FactoryModuleBuilder()
           .implement(PersonInterface.class, Person.class)
                 .build(PersonFactory.class));


        install(new FactoryModuleBuilder()
            .implement(IManager.class, Manager.class)
            .build(IManagerFactory.class));
      }
    }

注入工厂:

@Inject
PersonFactory pf;

@Inject
IManagerFactory manF;

并相应地使用它们,例如:

public void testGuice() {
    PersonInterface pi = pf.create(new Address("boh"));
    IManager im = manF.getIManager(pi);

    System.out.println(im.getPersonName());
}
 类似资料:
  • 我是Guice的新手,所以我试图理解AssistedInject。我有一个非常简单的项目: 我要注入的类: 带辅助注射的类别: 工厂 主类: 但它仍然不起作用,我不明白,我错在哪里?

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 问题内容: 来自dagger-discuss @: 我有一个类,它从对象图中获取一些依赖关系,而在运行时从调用者那里获取其他依赖关系。 我想出了一个解决方案,定义了一个工厂, 现在,我不再注入客户端的构造函数,而是直接注入并调用其方法。 如您所见,这很冗长且冗长。它还有很多重复和样板。使用来注释字段本身存在一些障碍,因此让我们暂时忽略这种可能性。 Square人员使用提供程序提出了一个有趣的解决方

  • 我目前正在我的应用程序中使用Guice。然而,我发现自己大多使用辅助注入,因为有一个注入对象链,它们都依赖于程序的输入。因此几乎所有的东西都是辅助注射的。 例如,A需要B,B需要c,c需要Z,Z需要来自命令行的输入。最后我感觉一切都将被辅助注射。因此,鉴于我坚持使用它,我想确定我使用它是正确的。 我个人觉得写我自己的工厂也一样好。此外,除了同样的优点之外,我还可以进一步将我所讨论的对象的创建限制在

  • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。