<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-295  評論-26  文章-1  trackbacks-0

    ???? 從網站上看到了有人提起這個框架——Guice,google名下的產物——一個彼Spring快的DI容器,興趣使然,馬上到http://code.google.com/p/google-guice/上去看了看,發現居然是Bob Lee這位大仙的杰作,還猶豫什么,download下來試試!

    ???? 恩,從哪里試起呢?還是老規矩,碰到新的東西就來驗證我們經典的例子——Hello World!

    ???? 這個東西說是DI,居然沒有.xml或者.properties文件,老天它用的是該死的Annotation,很好,要是大家也想嘗試的話統統5.0或者以上的干活。安裝好環境,開始動手!可是從哪里開始呢?既然說是DI容器,那好,我們先把我們的程序準備好,然后再看它把各個需要的東西怎么Inject。

    ???? 借鑒一下Spring開發手冊里的例子吧,稍微改改(無聊的人不要罵這個程序,因為它太簡單,我都想罵!)。既然是要打印,我們先來一個打印的服務接口:

    ?

    public ? interface ?PrintService
    {
    ????
    public ? void ?print(String?str);
    }

    ?

    很好,再來一個它的實現:

    ?

    public ? class ?PrintServiceImpl? implements ?PrintService
    {

    ????
    public ? void ?print(String?str)
    ????{
    ????????System.out.print(str);
    ????}

    }

    ?

    然后呢?一個打印客戶Client:

    ?

    public ? class ?Client
    {
    ????
    private ?String?str = " Hello?world " ;
    ????
    private ?PrintService?service;
    ???? void ?printString()
    ????{
    ????????service.print(str);
    ????}

    }

    ?

    看到了么?這次Inject的不是那個該死的字符串“Hello World”,而是該死的打印服務!好了,Client和我們的打印服務是分開的,我不知道Guice會怎么把打印服務在Client需要的時候Inject進來。不管怎么做,一個test是應該有的:

    ?

    import ?junit.framework.TestCase;

    public ? class ?testClient? extends ?TestCase
    {

    ????
    public ? void ?testPrintString()
    ????{
    ????????Client?client
    = new ?Client();
    ????????client.printString();
    ????}

    }

    ?

    好了,試試看,應該是紅色的條子。廢話,Client在這里根本不知道該死的打印服務在哪里。那么尋找打印服務就是Guice的事情了。

    ???? 讓我們看看Guice是怎么進行Inject的。我們想要Client在使用的時候找到打印服務,那么我們應該在Client需要的時候將其Inject進去,這樣的話我們需要寫一個類似于setter的東西來建造一個Inject點,那么我們在Client里添加些東西:

    ?

    import com.google.inject.Inject;
    public ? class ?Client
    {
    ????
    private ?String?str = " Hello?world " ;
    ????
    private ?PrintService?service;
    ??? @Inject
    ???? void ?injectPrintService(PrintService?service)
    ????{
    ????????
    this .service = service;
    ????}

    ????
    void ?printString()
    ????{
    ????????service.print(str);
    ????}

    }

    ?

    我們寫入了一個injectPrintService方法,這個方法可以充當Inject點,然后我們在這個方法上面來一個Annotation——@Inject”,這就是告訴Guice應該在哪里Inject我們需要的打印服務。

    ???? 好了,我們下面要做的就是把PrintService和我們的實現動態的綁定起來(接口編程,好主意)。在Guice里,我們需要實現一個叫做Module的接口,Guice將一個binder傳遞給你的Module,然后你的Module將接口和它的實現綁定起來。讓我們來試一下:

    ?

    import ?com.google.inject.Binder;
    import ?com.google.inject.Module;

    public ? class ?MyModule? implements ?Module
    {

    ????
    public ? void ?configure(Binder?binder)
    ????{
    ????????binder.bind(PrintService.
    class ).to(PrintServiceImpl. class );
    ????}

    }

    ?

    在我們需要打印服務的時候,Guice會自動創建一個PrintServiceImpl的實例給我們。OK,接下來就是如何注入的問題了,我們需要在test中實現:

    ?

    import ?junit.framework.TestCase;
    import ?com.google.inject. * ;

    public ? class ?testClient? extends ?TestCase
    {

    ????
    public ? void ?testPrintString()
    ????{
    ????????MyModule?mo
    = new ?MyModule();
    ????????Injector?in
    = Guice.createInjector(mo);
    ????????Client?client
    = new ?Client();
    ????????in.injectMembers(client);
    ????????client.printString();
    ????}

    }

    ?

    完了!一個全新的Hello world將要被打印出來了。

    ???? Guice的工作流程是這樣的:

    首先將自己創建的Module傳給Guice.createInjector(),Guice會為你的Module創建一個binder,你的Module利用這個binder來實現各種綁定,然后在Guice會創建一個Injector出來,我們就可以利用這個Injector來Inject我們的服務了。

    ???Guice將DI這個概念完完全全的詮釋了出來,使我們在編寫的應用的時候不必去考慮具體的實現在哪里,Guice會為你動態的綁定并且Inject的。很好使的框架,很有意思,以后繼續關注!!



    大盤預測 國富論
    posted on 2007-11-03 16:59 華夢行 閱讀(114) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日本高清不卡中文字幕免费| 亚洲国产AV一区二区三区四区| 国产特黄一级一片免费| 夫妻免费无码V看片| 亚洲喷奶水中文字幕电影 | 亚洲人成在线免费观看| 69国产精品视频免费| 亚洲国产午夜精品理论片| 男人的好免费观看在线视频| 国产精品亚洲午夜一区二区三区| 久久精品网站免费观看| 亚洲AV日韩AV永久无码色欲| 国产乱子伦精品免费无码专区 | 日韩免费高清播放器| 国产偷v国产偷v亚洲高清| a级毛片免费完整视频| 亚洲国产精品高清久久久| 69av免费观看| 亚洲AV成人影视在线观看| 日本特黄特色免费大片| 成年大片免费视频播放一级 | 亚洲永久中文字幕在线| 免费在线观看的网站| 国产综合激情在线亚洲第一页| 国产一区二区视频免费| 免费无码作爱视频| 亚洲国产夜色在线观看| 免费大香伊蕉在人线国产| 国产综合免费精品久久久| 亚洲性猛交xx乱| 亚洲AV成人潮喷综合网| 三年片在线观看免费西瓜视频| 亚洲国产精品成人综合久久久 | 9久热精品免费观看视频| 久久国产亚洲精品无码| 精品国产免费观看久久久| 久久国产美女免费观看精品 | 亚洲国产综合自在线另类| 免费看国产一级片| 亚欧免费视频一区二区三区| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 |