【问题标题】:Creating interface fields to inject vs Objects?创建接口字段以注入 vs 对象?
【发布时间】:2017-12-30 19:23:55
【问题描述】:

在我正在做的教程中,它使用接口来注入东西,例如它使用 IHotDrink 接口,然后创建一个实现 IHotDrink 的 Tea 类 。然后它有一个名为 Restaurant 的第三个类,该类在类中有一个 IHotDrink 字段,并在构造函数中对其进行初始化。然后通过将 Tea Class 注入到 Restaurant 类的构造函数(接受 IHotDrink 接口参数)

继续进行

所以基本上我的问题是:要注入的每个字段都需要是一个接口吗?

假设我有一堆食物都实现了 IHotFoods 接口,还有一堆饮料都实现了 IHotDrink 接口,可以吗?我有一个 meal class 没有实现任何东西,而是将 IHotFood 接口和 IHotDrink 接口作为参数传入其构造函数(这将后来被不同的食物/饮料类注入)然后在餐厅类中有一个用餐场,我可以用不同的用餐对象注射?这样可以吗?或者我是否必须:制作一个饭菜接口,让饭菜实现饭菜,让餐厅有一个饭菜接口字段,我可以将饭菜注入?

我不是在问是否每个类都应该实现一个接口,我是在问它们是否应该总是有 接口字段 来将其他也实现该接口的类注入到它们中。 (如教程中的示例)

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    不,没有必要总是有接口字段来将其他类注入到它们中,这些类也实现了该接口。 接口只是帮助您注入实现相同接口的不同字段。

    使用 Restaurant 类中的 IHotDrink 接口字段可以让您灵活地拥有实现 IHotDrink 的 Tea 以及也实现 IHotDrink 的 Coffee。

    关于您的“Meal”示例,由于您已经在 Meal 类中使用了 IHotDrink 和 IHotFood,因此您可以在 Meal 类中享用任何热饮和热食,因此您无需创建 Meals 界面并用餐实施膳食。

    【讨论】:

      【解决方案2】:

      我不是在问是否每个类都应该实现一个接口,我是 询问他们是否应该总是有接口字段来注入 其他类也实现了该接口。

      您可以尝试一下,您会发现无需指定接口即可让类成为可注入 bean。
      定义接口通常在两种情况下有意义:

      • 因为您有多个实现并且不想对声明的类型进行限制。

      • 当您在运行时使用字节码生成来动态创建将实现所需接口的运行时类(例如org.springframework.data.jpa.repository.JpaRepository 的情况)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-24
        • 2021-12-11
        • 2020-08-26
        • 2011-04-29
        • 2011-10-28
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多