依赖注入java

依赖注入java,java,dependency-injection,Java,Dependency Injection,下面是依赖项注入的一个有效示例 public class Employee { private String name; private String company; public Employee(String name, String company){ this.name = name; this.company = company; } public String getName(){ retu

下面是依赖项注入的一个有效示例

public class Employee {
    private String name;
    private String company;

    public Employee(String name, String company){
        this.name = name;
        this.company = company;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getCompany(){
        return company;
    }
    public void setCompany(String company){
        this.company = company;
    }
}
应用程序
类依赖于
员工

public class Application {

    private static Employee emp;
    private static String name;
    private static String company;

    public Application(Employee emp){
        this.emp = emp;
    }

    public static String getApplication(){
        name = emp.getName();
        company = emp.getCompany();
        return "Name: " + name + "\nCompany: " + company;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Employee emp1 = new Employee("John", "ABC");
        Application app1 = new Application(emp1);
        System.out.println(app1.getApplication());
    }

}

您正在此处成功注入依赖项:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
由于
应用程序的实例
需要
员工的实例
,因此在其构造函数上声明必须提供一个实例。这是一个颠倒依赖关系的教科书示例。(或者,简化为“需要,不要实例化”)

但是,如何存储这种依赖关系有点值得怀疑:

private static Employee emp;
在提供的示例中,这可能不会导致任何问题。但是,当您需要创建另一个需要另一个
Employee
依赖项实例的
应用程序
实例时,会发生什么情况?第二个实例将覆盖第一个实例并打破其依赖关系

如果实例需要依赖项,则实例应存储依赖项:

private Employee emp;
(甚至可以将其设置为
final
,除非您有理由在实例生命周期内更改它。)



诚然,名称
应用程序
的语义意味着只有一个实例。但在这种情况下,单例实例可能比
static
成员更好。作为面向对象编程的一般经验法则,在使用
static
成员时一定要谨慎。它们有自己的用途,但也很容易被误用。

您在这里成功地注入了依赖关系:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
由于
应用程序的实例
需要
员工的实例
,因此在其构造函数上声明必须提供一个实例。这是一个颠倒依赖关系的教科书示例。(或者,简化为“需要,不要实例化”)

但是,如何存储这种依赖关系有点值得怀疑:

private static Employee emp;
在提供的示例中,这可能不会导致任何问题。但是,当您需要创建另一个需要另一个
Employee
依赖项实例的
应用程序
实例时,会发生什么情况?第二个实例将覆盖第一个实例并打破其依赖关系

如果实例需要依赖项,则实例应存储依赖项:

private Employee emp;
(甚至可以将其设置为
final
,除非您有理由在实例生命周期内更改它。)



诚然,名称
应用程序
的语义意味着只有一个实例。但在这种情况下,单例实例可能比
static
成员更好。作为面向对象编程的一般经验法则,在使用
static
成员时一定要谨慎。它们有自己的用途,但也很容易被误用。

这是DI的一个例子。你可以在这里做:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
 public Application(Employee emp){
    this.emp = emp;
}
您可以在这里实现它:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
 public Application(Employee emp){
    this.emp = emp;
}
这种DI称为构造函数注入。


如果您的应用程序类中有一个雇员的setter,并且您使用该setter设置了雇员,那么它将被称为setter injection,这是DI的一个示例。你可以在这里做:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
 public Application(Employee emp){
    this.emp = emp;
}
您可以在这里实现它:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
 public Application(Employee emp){
    this.emp = emp;
}
这种DI称为构造函数注入。


如果您的应用程序类中有一个employee setter,并且您使用该setter设置了employee,那么它将被称为setter injection

首先您可能想了解何时使用依赖项注入。 注入一个没有功能的简单类的实例对我来说毫无意义

您通常为同样具有行为的类使用接口,它不仅仅是数据的包装器。删除static,可能添加final,并在注入中为该接口发送一个实现实例

像这样:

public class TextEditor {
   /*Interface SpellChecker**/
   private final SpellChecker spellChecker;
   private String text; 

   /**An implementation for the SpellChecker is provided*/
   public TextEditor(final SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public Boolean spellCheck(){
      return this.spellChecker.isSpellingCorrectForText(this.text);
   }
}
正如您在上面的示例中所看到的,拼写检查职责被委托给一个外部依赖项,该依赖项被注入构造函数中。TextEditor不需要知道如何进行拼写检查,只需使用方法调用接口即可

我们为什么要这样做?要尊重实体(SRP):

详情如下:

首先,您可能想了解何时使用依赖项注入。 注入一个没有功能的简单类的实例对我来说毫无意义

您通常为同样具有行为的类使用接口,它不仅仅是数据的包装器。删除static,可能添加final,并在注入中为该接口发送一个实现实例

像这样:

public class TextEditor {
   /*Interface SpellChecker**/
   private final SpellChecker spellChecker;
   private String text; 

   /**An implementation for the SpellChecker is provided*/
   public TextEditor(final SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public Boolean spellCheck(){
      return this.spellChecker.isSpellingCorrectForText(this.text);
   }
}
正如您在上面的示例中所看到的,拼写检查职责被委托给一个外部依赖项,该依赖项被注入构造函数中。TextEditor不需要知道如何进行拼写检查,只需使用方法调用接口即可

我们为什么要这样做?要尊重实体(SRP):

详情如下:

私人静态员工emp。。。静止的不,不是。除了在
main
方法上,您不需要
static
private static emp。。。静止的不,不是。除了在
main
方法上,您不需要
static