# 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](https://en.wikipedia.org/wiki/Inversion_of_control) >[維基-JavaBeans](https://zh.wikipedia.org/wiki/JavaBeans) >[淺談 IoC/DI 依賴注射與控制反轉](https://blog.toright.com/posts/4385/%E6%B7%BA%E8%AB%87-iocdi-%E4%BE%9D%E8%B3%B4%E6%B3%A8%E5%B0%84%E8%88%87%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%89.html) >[羅倫斯的IT航海日誌-關於getter與setter](https://dotblogs.com.tw/law1009/2012/01/06/64665) >[什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?](https://blog.csdn.net/chenchunlin526/article/details/69939337)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up