圖1 控制反轉概念結構依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數的構造子或者接口,使容器可以在初始化時組裝對象的依賴關系。其與依賴查找方式相比,主要優勢為:<1>查找定位操作與應用代碼完全無關。<2>不依賴于容器的API,可以很容易地在任何容器以外使用應用對象。<3>不需要特殊的接口,絕大多數對象可以做到完全不必依賴容器。 2.好萊塢原則IoC體現了好萊塢原則,即“不要打電話過來,我們會打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時候,模板方法模式的核心是,基類(抽象類)定義了算法的骨架,而將一些步驟延遲到子類中。
圖2 模板方法模式類圖 現在來考慮IoC的實現機制,組件定義了整個流程框架,而其中的一些業務邏輯的實現要借助于其他業務對象的加入,它們可以通過兩種方式參與到業務流程中,一種是依賴查找(Dependency Lookup),類似與JDNI的實現,通過JNDI來找到相應的業務對象(代碼1),另一種是依賴注入,通過IoC容器將業務對象注入到組件中。 3. 依賴查找(Dependency Lookup)下面代碼展示了基于JNDI實現的依賴查找機制。| public class MyBusniessObject{ PRivate DataSource ds; private MyCollaborator myCollaborator; public MyBusnissObject(){Context ctx = null;try{ ctx = new InitialContext(); ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”); myCollaborator = (MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”); }…… |
| package com.zj.ioc.di; public class Content { public void BusniessContent(){ System.out.println("do business"); } public void AnotherBusniessContent(){ System.out.println("do another business"); }} |
| package com.zj.ioc.di.ctor;import com.zj.ioc.di.Content; public class MyBusiness { private Content myContent; public MyBusiness(Content content) { myContent = content; } public void doBusiness(){ myContent.BusniessContent(); } public void doAnotherBusiness(){ myContent.AnotherBusniessContent(); }} |
| package com.zj.ioc.di.set;import com.zj.ioc.di.Content; public class MyBusiness { private Content myContent; public void setContent(Content content) { myContent = content; } public void doBusiness(){ myContent.BusniessContent(); } public void doAnotherBusiness(){ myContent.AnotherBusniessContent(); }} |
| package com.zj.ioc.di.iface;import com.zj.ioc.di.Content; public interface InContent { void createContent(Content content);} |
| package com.zj.ioc.di.iface;import com.zj.ioc.di.Content; public class MyBusiness implements InContent{ private Content myContent; public void createContent(Content content) { myContent = content; } public void doBusniess(){ myContent.BusniessContent(); } public void doAnotherBusniess(){ myContent.AnotherBusniessContent(); }} |
| public static void main(String[] args) throws Exception{//get the bean factoryBeanFactory factory = getBeanFactory();MessageRender mr = (MessageRender) factory.getBean(“renderer”);mr.render();} |
|
新聞熱點
疑難解答