Java 带继承的Guice注入

Java 带继承的Guice注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,首先,我很抱歉,我不能得到更具体的措辞为我的标题。以下是我的代码片段: public abstract class A { // dependencies private Client client; @Inject public A(Client client) { this.client = client; } public abstract foo(); protected void bar() { client.bar(); } } public

首先,我很抱歉,我不能得到更具体的措辞为我的标题。以下是我的代码片段:

public abstract class A {
 // dependencies
 private Client client;

 @Inject 
 public A(Client client) {
    this.client = client;
 }

 public abstract foo();

 protected void bar() {
  client.bar();  
 }
}

public class B extends A {
 ...
}

public class C extends A {
 ...
}
我的问题是:B和C实际上都不关心boo方法在A中是如何实现的。A只使用客户端实现boo。我不想继续通过B和C的构造函数注入客户机。我有什么选择?我想我可以直接在客户机字段声明上使用@Inject注释,而不是构造函数。这是一个好方法吗?还有其他推荐的方法吗?还是我对DI有些误解

提前感谢,,
Bhargava

我最近开始使用的一种模式是子类继承父类,并将其注入。父类只需要一个复制构造函数,也不能是抽象的:

class A {
  private Client client;

  @Inject
  public A(Client client) {
    this.client = client;
  }

  public A(A other) {
    this(other.client);
  }
}

class B extends A {
  @Inject
  public Child(A a, Others others) {
    super(a);
  }
}

A的依赖项保留在A中,B的依赖项保留在B中。

我最近开始使用的一种模式是子类继承父类,并将其注入。父类只需要一个复制构造函数,也不能是抽象的:

class A {
  private Client client;

  @Inject
  public A(Client client) {
    this.client = client;
  }

  public A(A other) {
    this(other.client);
  }
}

class B extends A {
  @Inject
  public Child(A a, Others others) {
    super(a);
  }
}

A的依赖项保留在A中,B的依赖项保留在B中。

在字段上使用@Inject是正常的。谢谢@yatul!知道这一点很好。我不知道,我更喜欢避免字段上的@Inject。这是最难测试的注入方式;我宁愿把它保存在构造函数中,即使它在这里或那里添加了一些构造函数参数。@LouisWasserman,这也是我的想法。但是,如果我们真的有好的测试模块可以用来注入假实现,我仍然可以使用测试模块+基于参数的构造函数。我所关心的是注射剂分散在两个不同的地方可能不是那么糟糕,注射剂的性质也不平凡。为什么不直接使用成分呢?您可以创建一个接口foore{void foo;}并将一个foore注入到a的构造函数中。然后您可以使类a成为具体的、最终的,并完全回避这个问题。正是由于这个原因,专注于组合的依赖注入并不能很好地处理继承;子类需要知道如何构造基类,而DI的目标是隐藏构造细节。不管怎样,抽象类的构造函数上的@Inject都会产生误导,因为Guice无法调用它。在字段上使用@Inject是正常的。谢谢@yatul!知道这一点很好。我不知道,我更喜欢避免字段上的@Inject。这是最难测试的注入方式;我宁愿把它保存在构造函数中,即使它在这里或那里添加了一些构造函数参数。@LouisWasserman,这也是我的想法。但是,如果我们真的有好的测试模块可以用来注入假实现,我仍然可以使用测试模块+基于参数的构造函数。我所关心的是注射剂分散在两个不同的地方可能不是那么糟糕,注射剂的性质也不平凡。为什么不直接使用成分呢?您可以创建一个接口foore{void foo;}并将一个foore注入到a的构造函数中。然后您可以使类a成为具体的、最终的,并完全回避这个问题。正是由于这个原因,专注于组合的依赖注入并不能很好地处理继承;子类需要知道如何构造基类,而DI的目标是隐藏构造细节。不管怎样,抽象类的构造函数上的@Inject都会产生误导,因为Guice无法调用它。