2012-05-31 30 views
2

首先,对不起,我无法得到我的标题更具体的措辞。这里是我的代码片段:继承的虱子注射

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仅使用client执行boo。我不想通过BC的构造函数继续注入client。我有什么选择?我认为我可以直接在client字段声明中使用@Inject注释,而不是构造函数。这是一个好方法吗?还有其他建议的方法吗?或者我在这里误解了关于DI的一些事情?

由于提前, 巴尔加瓦我最近开始使用

+0

这是正常使用'@ Inject'上的字段。 – yatul

+0

谢谢@yatul!这很好。 – Bhargava

+2

我不知道,我更愿意在字段上避免使用@Inject。这是注入最少的可测试方法;我更喜欢将它保留在构造函数中,即使它在这里和那里添加了一些构造函数参数。 –

回答

-1

一种模式是子类继承父类(明显),并且还注入它。父类只需要一个拷贝构造函数,也不能是抽象的:

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.