簡體   English   中英

依賴注入Java

[英]Dependency injection java

以下是依賴關系注入的有效示例。

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;
    }
}

Application類依賴於Employee

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);

由於Application實例需要Employee實例,因此在其構造函數上廣告必須提供一個實例。 這是反轉依賴關系的教科書示例。 (或者簡化為“需要,不要實例化。”)

但是,如何存儲該依賴項有點可疑:

private static Employee emp;

在提供的示例中,這可能不會引起任何問題。 但是,當您需要創建另一個需要Employee依賴實例的Application實例時,會發生什么? 第二個實例將覆蓋第一個實例並打破其依賴性。

如果實例需要依賴關系,則實例應存儲依賴關系:

private Employee emp;

(甚至還可能使其final確定,除非您有理由在實例生命期內對其進行更改。)


當然,名稱Application的語義意味着只有一個實例。 但是在這種情況下,單例實例可能比static成員更好。 作為面向對象編程的一般經驗法則,請謹慎使用static成員。 他們有自己的用途,但是他們也很容易濫用。

這是DI的一個例子。 您在這里做:

Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);

您在這里實現它:

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

這種DI被稱為構造函數注入。

如果您在應用程序類中有一個員工設置工,並且用該設置工設置了員工,那么這將被稱為設置工注入

首先,您可能想了解何時使用依賴項注入。 注入沒有功能的簡單類的實例對我來說毫無意義。

通常,對於具有行為的類使用接口,它不只是數據包裝器。 刪除靜態對象,也許添加一個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不需要知道如何進行拼寫檢查,他只需使用方法調用接口即可。

我們為什么要做這個? 要遵守SOLID(SRP): https ://en.wikipedia.org/wiki/SOLID_(面向對象的設計

更多內容, 訪問https : //softwareengineering.stackexchange.com/questions/135971/when-is-it-not-appropriate-to-use-the-dependency-injection-pattern http://www.tutorialspoint.com/spring/ spring_dependency_injection.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM