Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice辅助注入,绑定顺序_Java_Guice - Fatal编程技术网

Java Guice辅助注入,绑定顺序

Java Guice辅助注入,绑定顺序,java,guice,Java,Guice,我在实施辅助注射时遇到错误 辅助注射一直很有效,直到我引入了另一个名为Manager的类,它依赖于辅助Personclass。经理想使用个人(@assisted Address)。代码在构造喷油器图时中断。它没有走得更远 Injector injector = Guice.createInjector(myModule); 直觉上,我理解当对象A被辅助时,B(依赖于A)实际上也通过A被隐式辅助 请注意,我查过了。我想像科林这样的人肯定知道答案 出于好奇,是否有好的技术/工具来发现Guice

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

辅助注射一直很有效,直到我引入了另一个名为Manager的类,它依赖于辅助
Person
class。经理想使用
个人(@assisted Address)
。代码在构造喷油器图时中断。它没有走得更远

Injector injector = Guice.createInjector(myModule); 
直觉上,我理解当对象A被辅助时,B(依赖于A)实际上也通过A被隐式辅助

请注意,我查过了。我想像科林这样的人肯定知道答案

出于好奇,是否有好的技术/工具来发现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)
com.google.inject.CreationException:无法创建注入器,请参阅以下错误:
1) 未绑定用@com.google.inject.assistedinject.assisted(value=)注释的…assisted_inject.Address的实现。
查找带有@com.google.inject.assistedinject.assisted注释的…assisted_inject.Address时(值=)
对于参数2,在..辅助_inject.Person.(Person.java:13)

将此绑定放入模块时:

bind(IManager.class).to(Manager.class);
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));
      }
    }
Guice将尝试创建
Manager
类的新实例。它查找一个(但只有一个)用
@Inject
注释的构造函数,或一个作为非私有的回退零参数构造函数的构造函数。这是Guice将使用的构造函数:

@Inject
public Manager(Person person) {
   this.person=person;
}
现在,遵循相同的规则,Guice将尝试使用适当的构造函数实例化一个
,它将被卡在这里:

@Inject
public Person(String name, @Assisted Address address) {
    this.name = name;
    this.address = address;
}
由于
@Assisted
注释,它将在尝试实例化地址时放弃。此注释是一个注释,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();
    }

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

bind(IManager.class).to(Manager.class);
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());
}

将此绑定放入模块时:

bind(IManager.class).to(Manager.class);
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));
      }
    }
Guice将尝试创建
Manager
类的新实例。它查找一个(但只有一个)用
@Inject
注释的构造函数,或一个作为非私有的回退零参数构造函数的构造函数。这是Guice将使用的构造函数:

@Inject
public Manager(Person person) {
   this.person=person;
}
现在,遵循相同的规则,Guice将尝试使用适当的构造函数实例化一个
,它将被卡在这里:

@Inject
public Person(String name, @Assisted Address address) {
    this.name = name;
    this.address = address;
}
由于
@Assisted
注释,它将在尝试实例化地址时放弃。此注释是一个注释,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();
    }

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

bind(IManager.class).to(Manager.class);
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());
}

卢乔,谢谢你。你的解释完全有道理。在旁白中,我认为BindingAnnotation是为其他目的而设计的,特别是为了将给定类型绑定到多个不同的实现。我的结论是Guice似乎以不同的方式构建辅助路径,并可能生成更智能的错误消息来指示设置中的缺陷(缺少工厂)@Vortex
@Assisted
是一个
@BindingAnotation
的原因基本上在于它的实现方式:有效,它生成的工厂方法创建一个子注入器,将
@Assisted Address
的绑定添加到参数值,并注入
Person
。Lucho,谢谢。你的解释完全有道理。在旁白中,我认为BindingAnnotation是为其他目的而设计的,特别是为了将给定类型绑定到多个不同的实现。我的结论是Guice似乎以不同的方式构建辅助路径,并可能生成更智能的错误消息来指示设置中的缺陷(缺少工厂)@Vortex
@Assisted
是一个
@BindingAnotation
的原因基本上在于它的实现方式:有效,它生成的工厂方法创建子注入器,将
@辅助地址
的绑定添加到参数值,并注入
人员