DI如何在Spring Framework中运行?

时间:2018-03-07 07:25:08

标签: spring spring-boot dependency-injection inversion-of-control ioc-container

public interface MyInterface {
    public void doSomething();
}

public class MyInterfaceImpl implements MyInterface {
    public void doSomething() {
        System.out.println("ok");
    }
}

public class MyClass {
    private MyInterface obj;

    public MyClass(MyInterface obj) {
        this.obj = obj;
    }

    public MyMethod() {
        obj.doSomething();
    }
}

我已经在构造函数中注入了一个接口。我该如何使这个样本有效? IoC容器如何实现接口实现并允许我使用obj.doSomething? 我读过有关Spring的文档,但很难理解。

1 个答案:

答案 0 :(得分:1)

Spring需要几件事来使DI按预期工作,基本:

  • bean本身,具体实现(MyInterfaceImpl)
  • 注入此bean的位置

您的实施必须提供这些要求,

对于第一个和As @JB Nizet,你可以使用java(@Component@Repository ...或者xml方法来使spring知道bean,

在哪里注入bean有点棘手,因为如果你有单一的接口实现,spring可以很容易地知道下划线实现,因为默认的自动装配是技术类型MyInterfaceImpl类型{{1} },(这是纯粹的java接口逻辑,MyInterfaceImpl的类型是MyInterfaceMyInterfaceImpl两者)然后你可以简单地请求spring使用@Autowired注入bean

MyInterface

但是如果你有一个以上的实现,你将以两个类型为@Autowired private MyInterface obj 的bean结束,并且会发生异常,因为spring无法决定注入哪个实现,并且感觉,为了解决这种歧义,你可以提供例如MyInterface以通过特定的bean名称进行注入,例如here