【问题标题】:Purpose of the injection of an interface with multiple implementations注入具有多个实现的接口的目的
【发布时间】:2014-09-17 11:05:02
【问题描述】:

考虑如下的工厂:

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 一起使用?注入实现本身会更合适,还是我们总是只有一个实现工厂?另一个可能的答案:工厂使用接口不合适吗?

【问题讨论】:

    标签: java interface factory inject


    【解决方案1】:

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

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


    编辑:请参阅下面的我的 cmets 以获取 CDI 使用的链接以及此用例的更简单架构。

    【讨论】:

    • 在上面的例子中将使用哪个实现? SomeFactoryImpl 还是 AnotherFactoryImpl?
    • @Chris311: 无,因为从您的示例来看,someFactory 名称下的内容并不明显。 @Inject 需要确定要注入什么——要么你有一个具体的类,它有一个适当的构造函数,在注入之前被调用(参见 Java EE Tutorial on CDI),要么你必须有一个 @Producer 和一个适当的限定符来指向为您注入的 bean 提供正确的生产者(请参阅上一页后几页的 Java EE 教程)。
    • @Chris311:查看Adam Bien's article,了解如何使用 Java EE 摆脱上述用例的接口和工厂。
    • 那么,为我的工厂提供接口是否明智?目前,我的代码中只有一个实现和一个使用工厂的地方。
    • @Chris311:您可能知道在软件架构中保持简单的规则,并且在您真正需要它们之前不要过早地实现它们。 1)你不需要在接口和实现之间有1:1的关系;如果您至少有 2 个实现,则接口才是合理的。 2)工厂是某些特定对象的生产者,您不需要再次将其包装在接口中。 3) 如果您使用 CDI(甚至可以在 Java EE 之外完成),您可以按照上面链接中的说明拥有合格的生产者并省略工厂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2018-09-23
    • 2014-07-25
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多