<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无码精品色午夜| 亚洲欧美日韩久久精品| 国产精品久久久久久久久免费| 亚洲色大情网站www| 国产av无码专区亚洲av果冻传媒| 久久久久久夜精品精品免费啦| 亚洲欧美aⅴ在线资源| 中文字幕在线亚洲精品| 91福利视频免费观看| 午夜在线亚洲男人午在线| 亚洲久本草在线中文字幕| 国产乱人免费视频| 最近免费中文字幕大全免费版视频| 亚洲国产成人无码AV在线| 亚洲av无码专区在线播放| 精品剧情v国产在免费线观看 | 亚洲成a人片在线观看天堂无码| 国产午夜亚洲精品午夜鲁丝片| 亚洲免费综合色在线视频| 久久久精品视频免费观看 | 在线播放免费播放av片| 精品在线免费观看| 亚洲av最新在线观看网址| 亚洲色欲色欲综合网站| 亚洲AV伊人久久青青草原| 久草在视频免费福利| 国产一级淫片a免费播放口| 亚洲成av人片在www鸭子| 亚洲精品福利视频| 久久久久亚洲AV成人网人人网站| 欧美a级成人网站免费| 午夜视频免费在线观看| xxxxxx日本处大片免费看| 在线aⅴ亚洲中文字幕| 亚洲国产一区二区a毛片| 亚洲伊人久久综合影院| 国产在线不卡免费播放| 99在线视频免费观看视频| 性xxxxx大片免费视频| 国产性生大片免费观看性| 国产成人亚洲精品无码AV大片|