<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 華夢行 閱讀(111) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲综合男人的天堂色婷婷| 无码一区二区三区免费视频| 久久九九全国免费| 久久久久国产精品免费免费搜索| 免费在线观看亚洲| 亚洲男人天堂影院| 四虎影视无码永久免费| 亚洲国产一级在线观看| 亚洲欧洲国产综合AV无码久久| 2019中文字幕在线电影免费| 亚洲精品亚洲人成在线观看| 在线观看亚洲网站| 黄a大片av永久免费| 亚洲激情视频图片| 成人无码区免费A片视频WWW | 亚洲精品日韩一区二区小说| 美丽的姑娘免费观看在线播放| 亚洲嫩模在线观看| 亚洲人成色4444在线观看| 国产一卡二卡3卡四卡免费| 亚洲专区一路线二| 麻豆国产精品免费视频| 日本久久久久亚洲中字幕| 色欲国产麻豆一精品一AV一免费| 亚洲高清国产AV拍精品青青草原| 日韩精品人妻系列无码专区免费| 久久精品国产99精品国产亚洲性色| 日本免费电影一区二区| 亚洲精品乱码久久久久久久久久久久 | 7777久久亚洲中文字幕蜜桃 | 亚洲韩国精品无码一区二区三区| 四虎影视久久久免费观看| 亚洲精品国精品久久99热| 一日本道a高清免费播放| 亚洲中文字幕视频国产| 成全在线观看免费观看大全| 久久综合图区亚洲综合图区| 在线jlzzjlzz免费播放| 三年片免费观看大全国语| 亚洲第一页在线观看| 亚洲av区一区二区三|