近來,在java社群里越來越多的提及的一個詞匯就是輕量級容器,這些容器能夠幫助開發者將來自不同項目的組件組裝成為一個內聚的應用程序。在這些輕量級容器的的背后有一個共同的模式,這個模式決定了這些組件進行裝配的方式——那就是控制反轉(Inversion of
Control,IoC)。
控制反轉的作用和目的就是應該將組件的配置與使用分離開,使其更具條理化,容易適應變化的環境,或者稱為解耦合。
組件與服務
所謂“組件”是指這樣一個軟件單元:它將被作者無法控制的其他應用程序使用,但后者不能對組件進行修改。也就是說,使用一個組件的應用程序不能修改組件的源代碼,但可以通過作者預留的某種途徑對其進行擴展,以改變組件的行為。
服務和組件有某種相似之處:它們都將被外部的應用程序使用。在我看來,兩者之間最大的差異在于:組件是在本地使用的(例如JAR 文件、程序集、DLL、或者源碼導入);而服務是要通過——同步或異步的——遠程接口來遠程使用的(例如web service、消息系統、RPC,或者socket)。
這些輕量級容器則使用了更為靈活的辦法,只要插件遵循一定的規則,一個獨立的組裝模塊就能夠將插件的具體實現“注射”到應用程序中,這種方法也就被稱為依賴注入!
Dependency Injection 模式的基本思想是:用一個單獨的對象(裝配器)來獲得MovieFinder的一個合適的實現,并將其實例賦MovieLister 類的一個字段。
依賴注入的形式有三種:分別將它們叫做構造子注入(Constructor Injection)、設值方法注入(Setter Injection)和接口注入(Interface Injection)。這三種注入形式分別就是type 1 IoC(接口注入)、type 2 IoC(設值方法注入)和type 3 IoC(構造子注入)