【问题标题】:Spring DI? Interface Type?春天迪?接口类型?
【发布时间】:2012-03-17 17:45:18
【问题描述】:

我了解方法,但似乎无法正式定义定义。

众所周知,DI 可以通过构造函数、setter 或接口来完成。 我对最新的基于单接口的 DI 感到困惑,它是在 Spring 中使用的吗?

更新:我在这里给出了不好的例子,导致理解错误。

修复它:

假设我们有 setter,并且在 setter 中我们注入由某个类实现的接口。这是否被认为是通过 setter 或接口进行的 DI?

http://martinfowler.com/articles/injection.html#UsingAServiceLocator 本文将 DI 划分为:

“依赖注入主要有三种风格。我为它们使用的名称是构造函数注入、设置器注入和接口注入。如果你在当前关于控制反转的讨论中读到这些东西,你会听到这些被称为 1 型 IoC(接口注入)、2 型 IoC(setter 注入)和 3 型 IoC(构造函数注入)。我发现数字名称很难记住,这就是我在这里使用这些名称的原因。 "

用于 IoC 的其他服务定位器模式,它是真正使@Autowired 成为可能的模式吗? - 即并非所有类都需要在 xml 中为 DI 显式声明,因为如果我没记错的话,我们可以再次将它们声明为 @Repository 或 @Controller 或类似名称。

谢谢,

【问题讨论】:

    标签: spring dependency-injection


    【解决方案1】:

    自动装配接口意味着装配实现该接口的 bean。这依赖于 bean 工厂中实际存在的实现。

    @Autowired
    UserService us; // wire a bean implementing UserService
    

    --

    @Service
    public class UserServiceImpl implements UserService {
        // the @Service annotation causes this implementation of UserService to 
        // be made available for wiring in the bean factory.
    }
    

    值得注意的是,如果您通过接口进行连接,Spring 将期望在实现该接口的 bean 工厂中存在一个且正是一个 bean。如果找到多个 bean,则会引发错误,您必须指定要连接的 bean(使用 @Qualifier 注释)。

    编辑:

    连接时,可以连接成员变量或设置方法。

    @Autowired
    UserService us;
    

    --

    @Autowired
    public void setUserService(UserService us) {
        this.us = us;
    }
    

    这两个产生相同的结果。不同之处在于,在前者中,Spring 会使用反射将变量us 设置为实现UserService 的bean。在后者中,Spring 将调用 setUserService 方法,传递相同的 UserService 实现。

    【讨论】:

    • 请与其他 DI 方法进行比较,因为现在我更加困惑。我明白了意思,但让我们暂时离开@Autowired。(忘记上下文:组件扫描 - 说我们没有它)请告诉我通过 setter 和接口的 DI 之间的区别 - 你可以在 setter 中设置接口- 那么通过接口或通过setter调用什么?那为什么要通过Setter OR Interface在DI上正式划分呢。
    • “DI通过setter和interface的区别” - 苹果和橙子,它们彼此无关。请参阅上面的编辑。
    • 我完全理解你在做什么以及它是如何工作的。(我自己做了实现,效果很好)这就是我认为无法比较的。但是为什么文章作者把接口注入和setter、constructor注入放在一起呢?
    • @Aubergine - 作者正在描述三种不同的 IoC 范例(至少,他 5 年前的 IoC 版本):构造函数、设置器和接口。我认为他在文章中很好地解释了他的想法。不确定我是否真的理解你的问题(如果确实有的话)。仅供参考,服务定位器非常“EJB 2.0”。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2020-10-13
    • 2016-05-25
    • 2014-08-22
    相关资源
    最近更新 更多