注入具有多个实现的接口的目的

时间:2014-09-17 11:05:02

标签: java interface factory inject

考虑如下工厂:

public interface SomeFactory {
    public SomeValue createSomething(SomeKey key);
}

此外,我们得到了SomeFactory的一些实现:

public class SomeFactoryImpl implements SomeFactory {

    @Override
    public SomeValue createSomething(Key key) {
        // some logic
    }

}

让我们考虑一个想要使用这个工厂的班级:

public class SomeClass{

@Inject
private SomeFactory someFactory;

    public String someMethod(Key someKey) {
        someFactory.createSomething(someKey);
        // some more logic
    }
}

在这种情况下,为工厂使用接口有什么好处?我想到了以下几点:

让我们假设我想为我的工厂使用另一种实现:

public class AnotherFactoryImpl implements SomeFactory {

    @Override
    public SomeValue createSomething(Key key) {
        // some logic
    }

}

然后将哪个工厂与@Inject-annotation一起使用?注入实现本身更合适,还是我们总是只有一个工厂实现?另一个可能的答案:是否不适合为工厂使用接口?

1 个答案:

答案 0 :(得分:1)

使用界面的想法是,您不关心手中的实现,而只关注使用界面的方法,这些方法在所有实现中都很常见。别忘了,你必须使用相同的方法签名,包括覆盖时的相同返回值。

注入机制按名称工作 - 因此,由于您未在@Inject中指定值,因此它会查找名为someFactory的对象并将其注入,这很好,因为它&# 39;类型为SomeFactory的s,无论后面是哪种实现。您可以注入一个特定的实现,如果您处理常见行为或特定行为,这取决于您的用例。要注入的实例必须绑定到您正在使用的范围,或者必须有Producer,以便在需要注入时创建对象。


编辑:请参阅下面的评论,以获取有关CDI用法的链接以及此用例的更简单架构。