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

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


          網站導航:
           
          主站蜘蛛池模板: 百色市| 法库县| 土默特左旗| 安仁县| 弥勒县| 泸溪县| 苏尼特右旗| 新巴尔虎左旗| 荃湾区| 孟津县| 恩平市| 鄂伦春自治旗| 江油市| 安康市| 包头市| 定远县| 清流县| 苍山县| 天等县| 阳江市| 乐陵市| 无棣县| 天台县| 鄂伦春自治旗| 辽中县| 宁夏| 龙里县| 河池市| 邳州市| 河南省| 伊吾县| 龙山县| 晋州市| 昌宁县| 北宁市| 寿光市| 阿克| 法库县| 华安县| 宜州市| 乐山市|