Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
依赖注入:Spring和Java_Java_Spring_Dependency Injection - Fatal编程技术网

依赖注入:Spring和Java

依赖注入:Spring和Java,java,spring,dependency-injection,Java,Spring,Dependency Injection,我最近开始使用Spring框架。 在一本书中,我发现了这个例子: public class DamselRescuingKnight implements Knight { private RescueDamselQuest quest; public DamselRescuingKnight() { this.quest = new RescueDamselQuest(); } public void embarkOnQuest() { q

我最近开始使用Spring框架。 在一本书中,我发现了这个例子:

public class DamselRescuingKnight implements Knight {

   private RescueDamselQuest quest;

   public DamselRescuingKnight() {
      this.quest = new RescueDamselQuest();
   }

   public void embarkOnQuest() {
      quest.embark();
   }
}
使用Spring构造函数依赖项注入,示例变成:

public class DamselRescuingKnight implements Knight {

   private Quest quest;

   public DamselRescuingKnight(Quest quest) {
      this.quest = quest;
   }

   public void embarkOnQuest() {
      quest.embark();
   }
}
而xml文件配置为:

<bean id="knight" class="com.springinaction.knights.DamselRescuingKnight">
   <constructor-arg ref="quest" />
</bean>

<bean id="quest" class="com.springinaction.knights.somethingThatImplementsQuest">
</bean>

为了全面理解这个概念,,
您是否可以编写一个仅使用Java(没有Spring,因此没有xml文件)的相同类的依赖项注入的替代示例?

这相当于配置文件中的依赖项注入。唯一的区别是您的
Quest
对象是在
BraveKnight
实例之后创建的

public class BraveKnight {
    private Quest quest;
    public BraveKnight(Quest quest) {
        this.quest = quest;
    }
}

public class Quest {

}

public class Main {
    public static void main (String[] args) {
        Quest quest = new Quest();
        BraveKnight knight = new BraveKnight(quest);
    }
}

Java不会在某种容器的概念之外本机实现DI。“容器”是一组在代码之前获得控制权的类。它实例化bean并在适当的位置注入它们。容器可以是Spring或JavaEE系统。普通JavaSE代码(即以
main(String[])
method开始运行的代码)不进行DI。这是DI在幕后所做的,但DI的全部要点是,您的代码不必担心创建对象并将它们连接在一起。所以称之为DI有点牵强。所以两种解决方案都是相同的…骑士没有耦合到任何特定的Quest实现(与第一个示例不同)…那么我为什么要使用spring解决方案呢?