IoC/DI

tags: 技術分享 Ioc/DI

IoC/DI 分別是 Inversion of Control (控制反轉) 與 Dependency Injection (依賴注射) 這兩個單字的合體,字面上看起來實在是有點繞口。簡單的說,IoC (Inversion of Control) 控制反轉是一種物件導向程式設計的概念,主要的目的也是為降低系統耦合度(coupling),將程式中的控制邏輯進行移轉,讓程式碼之間的控制關係簡化。IoC 這個詞聽起來實在是太玄了,其中最常見的實作技巧就是 DI (Dependency Injection) 依賴注射設計模式 (Design Pattern),可以讓你的程式架構進行解耦合(Decoupling),更容易實現可以動態組合的模組化架構。

public class Computer {
    private  Keyboard keyboard;
    public Computer() {
    }
    
    //Getters and Setters
    public getKeyBoard(){
        return this.keyboard;
    }
    
    public setKeyBoard(Keyboard keyboard){
        this.keyboard = keyboard;
    }
}
class Container {
    public Container()
    {
        Computer computer= new Computer();
        computer.setKeyBoard(new Keyboard());
    }
}

Getters and Setters

所謂的getter以及setter是用來作為物件的私有(private)變數或屬性(field)的公用存取介面(public access interface)

POJO

POJO(Plain Old Java Object)這種叫法是 Martin Fowler、Rebecca Parsons 和 Josh MacKenzie 在2000年的一次演講的時候提出來的。

按照 Martin Fowler 的解釋是 Plain Old Java Object。 POJO 的內在含義是指:那些沒有繼承任何類、也沒有實現任何接口,更沒有被其它框架侵入的 java 對象。

一個 POJO 是一個不受任何限制的 Java 對象(除了 Java 語言規範)。例如一個 POJO 不應該是

  1. 繼承類別,如 public class Foo extends javax.servlet.http.HttpServlet {
  2. 實作類別,如 public class Bar implements javax.ejb.EntityBean {
  3. 包含Annotation,如 @javax.ejb.Entity public class Baz{

POJO 可以認為是一個中間對象:

  1. POJO 持久化之後 -> PO (persistent object)

    • 有時也被稱為Data對象,對應數據庫中的entity,可以簡單認為一個PO對應數據庫中的一條記錄。
    • PO中不應該包含任何對數據庫的操作。
    • PO的屬性是跟數據庫表的字段一一對應的。
    • PO對象需要實現序列化接口。
    ​​​​public class User {
    
    ​​​​    private long id;
    ​​​​    
    ​​​​    private String name;
    
    ​​​​    public void setId(long id) {
    ​​​​        this.id = id;
    ​​​​    }
    
    ​​​​    public long getId() {
    ​​​​        return id;
    ​​​​    }
    
    ​​​​    public void setName(String name) {
    ​​​​        this.name = name;
    ​​​​    }
    ​​​​    
    ​​​​    public String getName() {
    ​​​​        return name;
    ​​​​    }
    ​​​​}
    
  2. POJO 傳輸過程中 -> DTO (Data Transfer Object)
    主要用於遠程調用等需要大量傳輸物件的地方,可以將PO中的部分屬性抽取出來,就形成了DTO。

    比如我們一張表有100個字段,那麼對應的 PO 就有100個屬性。
    但是我們界面上只要顯示10個字段,客戶端用 WEB service 來獲取數據,沒有必要把整個PO對像傳遞到客戶端,這時我們就可以用只有這10個屬性的 DTO 來傳遞結果到客戶端,這樣也不會暴露服務端表結構.到達客戶端以後,如果用這個對象來對應界面顯示,那此時它的身份就轉為VO(View Object)。

  3. POJO 用作表示層 -> VO (Value Object)

JavaBeans

JavaBean 實際上是指一種特殊的 Java 類別,它通常用來實現一些比較常用的簡單功能,並可以很容易的被重用或者是插入其他應用程序中。所有遵循一定編程原則的 Java 類別都可以被稱作 JavaBean。

JavaBean 是一個遵循特定寫法的 Java 類別,是一種 Java 語言編寫的可重用組件,它的方法命名,構造及行為必須符合特定的約定:

1、這個類別必須具有一個公共的(public)無參構造方法;
2、所有屬性私有化(private);
3、私有化的屬性必須通過 public 類型的方法(getter和setter)暴露給其他程序,並且方法的命名也必須遵循一定的命名規範。 
4、這個類應是可序列化的。 (比如可以實現 Serializable 接口,用於實現bean的持久性)

因為這些要求主要是靠約定而不是靠實現接口,所以許多開發者把 JavaBean 看作遵從特定命名約定的 POJO。 (可以這麼理解,POJO 按 JavaBean 的規則來,就可以變成 JavaBean)。

簡而言之,當一個 POJO 可序列化,有一個無參數的構造方法,使用 getter 和 setter 方法來訪問屬性時,它就是一個 JavaBean。

維基-Inversion of control
維基-JavaBeans
淺談 IoC/DI 依賴注射與控制反轉
羅倫斯的IT航海日誌-關於getter與setter
什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?