seasun  
          在不斷模仿、思考、總結中一步一步進步!
          公告
          •     我的blog中的部分資源是來自于網絡上,如果您認為侵犯了您的權利,請及時聯系我我會盡快刪除!E-MAIL:shiwenfeng@aliyun.com和QQ:281340916,歡迎交流。

          日歷
          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          常用鏈接

          隨筆分類

          good blog author

          積分與排名

          • 積分 - 81762
          • 排名 - 700

          最新評論

          閱讀排行榜

           

          Guice可真輕啊,所需的3Jar包才不到600k。但缺點就是必須JDK1.5以上,像我們公司有幾十個大大小小的Java項目,沒有一個是1.5的,有點感慨啊。廢話少說

           先建立一個service:

           

          IHelloService.java

          Java代碼
          1. package com.leo.service;  
          2.   
          3. import com.google.inject.ImplementedBy;  
          4. import com.leo.service.impl.HelloServiceImpl;  
          5.   
          6. /* 
          7.  * 采用annotation進行接口與實現類之間的綁定 
          8.  * 注意:接口與實現類之間綁定是必須的,如果只是單獨一個類,沒有接口, 
          9.  * 那么Guice會隱式的自動幫你注入。并且接口此是不應該聲明注入域范圍的, 
          10.  * 應該在其實現地方聲明 
          11.  * 
          12.  */  
          13. @ImplementedBy(HelloServiceImpl.class)  
          14. public interface IHelloService {  
          15.     public String sayHello(String str);  
          16. }  

           

           

          再來一個簡單的實現:

           

          HelloServiceImpl.java

          Java代碼
          1. package com.leo.service.impl;  
          2.   
          3. import com.google.inject.Singleton;  
          4. import com.leo.service.IHelloService;  
          5.   
          6. /* 
          7.  * 這里如果默認不用annotation標注其作用域,或在自定義的module也不指定的話 
          8.  * 默認的創建對象的方式是類似于Spring的prototype,在此處因為僅僅是一個stateless service 
          9.  * 我們用@Singleton來標注它,更多的作用域可看Guice文檔 
          10.  *  
          11.  * 注意:與標注@Singleton等效的工作也可以在自定義的module里來實現 
          12.  */  
          13.   
          14. @Singleton  
          15. public class HelloServiceImpl implements IHelloService {  
          16.   
          17.     public String sayHello(String str) {  
          18.         return new StringBuilder("Hello " + str + " !").toString();  
          19.     }  
          20.   
          21. }  

           

           

          Struts2的配置相信大家都會了,這里需要注意的是Struts2的工廠已經變了,默認是Spring現在我們要改成Guice,請看:

           

          struts.properties

          Java代碼
          1. struts.objectFactory = guice  
          2. #如果自已想實現Module接口,則下面注釋請去掉  
          3. #guice.module=com.leo.module.MyModule  
          4. struts.action.extension=  

           

           

          再來看看調用代碼,稍微比Spring簡潔了些:

           

          HelloAction.java

          Java代碼
          1. package com.leo.action;  
          2.   
          3. import com.google.inject.Inject;  
          4. import com.leo.service.IHelloService;  
          5. import com.opensymphony.xwork2.ActionSupport;  
          6.   
          7. public class HelloAction extends ActionSupport {  
          8.   
          9.     private static final long serialVersionUID = -338076402728419581L;  
          10.   
          11.     /* 
          12.      * 通過field字段進行注入,除此之外,還有construct, method注入均可 
          13.      */  
          14.     @Inject  
          15.     private IHelloService helloService;  
          16.   
          17.     private String message;  
          18.   
          19.     public String getMessage() {  
          20.         return message;  
          21.     }  
          22.   
          23.     public void setMessage(String message) {  
          24.         this.message = message;  
          25.     }  
          26.   
          27.     public String execute() {  
          28.         message = helloService.sayHello("leo");  
          29.         return SUCCESS;  
          30.     }  
          31.   
          32. }  

           

           

          struts.xml配置也是非常簡單:

           

          struts.xml

          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8" ?>  
          2. <!DOCTYPE struts PUBLIC  
          3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
          4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
          5.   
          6. <struts>  
          7.     <package name="default" extends="struts-default">  
          8.         <action name="hello" class="com.leo.action.HelloAction">  
          9.             <result>index.jsp</result>  
          10.         </action>  
          11.     </package>  
          12. </struts>  

           

           

          到這里,算是大功告成了,Guice文檔在與Struts2整合部分例子有誤,而且郁悶的是,竟然連Guice的Filter需要在web.xml配置都沒有說,我把配好的web.xml弄出來給大家看看

           

          web.xml

          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
          3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
          5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
          6.   
          7.     <filter>  
          8.         <filter-name>guice</filter-name>  
          9.         <filter-class>  
          10.             com.google.inject.servlet.GuiceFilter  
          11.         </filter-class>  
          12.     </filter>  
          13.   
          14.     <filter>  
          15.         <filter-name>struts</filter-name>  
          16.         <filter-class>  
          17.             org.apache.struts2.dispatcher.FilterDispatcher  
          18.         </filter-class>  
          19.     </filter>  
          20.   
          21.     <filter-mapping>  
          22.         <filter-name>guice</filter-name>  
          23.         <url-pattern>/*</url-pattern>  
          24.     </filter-mapping>  
          25.   
          26.     <filter-mapping>  
          27.         <filter-name>struts</filter-name>  
          28.         <url-pattern>/*</url-pattern>  
          29.     </filter-mapping>  
          30.   
          31.     <welcome-file-list>  
          32.         <welcome-file>index.jsp</welcome-file>  
          33.     </welcome-file-list>  
          34. </web-app>  

           

           

          可以布署,運行了,輸入http://localhost:8080/struts2_guice/hello 就可以看到結果了。

           

          如果你覺得Annotation太麻煩,或不喜歡,也可以嘗試自己實現Guice的Module,以下是一個簡單的實現:

          MyModule.java

          Java代碼
          1. package com.leo.module;  
          2.   
          3. import com.google.inject.Binder;  
          4. import com.google.inject.Module;  
          5. import com.google.inject.Scopes;  
          6. import com.leo.service.IHelloService;  
          7. import com.leo.service.impl.HelloServiceImpl;  
          8.   
          9. /* 
          10.  * 如果你覺得Annotation有種支離破碎的感覺,別急,Guice還為你提供一種統一 
          11.  * 注入管理的自定義實現。在本例中,先前的IHelloService, HelloServiceImpl 
          12.  * 你現在可以完全將所有的Annotation去掉,然后實現Module接口的唯一一個方法 
          13.  * 實現如下 
          14.  */  
          15. public class MyModule implements Module {  
          16.   
          17.     public void configure(Binder binder) {  
          18.   
          19.         /* 
          20.          * 將接口IHelloService 與其實現HelloServiceImpl 綁定在一起 并且作用域為Scopes.SINGLETON 
          21.          * 在這里有多種配置方法,但因為是入門實例,不想說的太復雜。其中如果不配置作用域,默認就是類似于Spring 
          22.          * 的Scope="prototype" 
          23.          */  
          24.         binder.bind(IHelloService.class).to(HelloServiceImpl.class).in(  
          25.                 Scopes.SINGLETON);  
          26.     }  
          27.   
          28. }  

           

           

          運行效果完全一模一樣,因此團隊開發如果統一風格的話Guice確實能快速不少。但目前Guice僅僅只是一個IoC,遠遠沒有Spring所涉及的那么廣,但又正如Rod Johnson反復在其《J2EE without EJB》里強調:架構要永遠 simplest, simplest 再 simplest,因此你覺得夠用,就是最好的。

           

          總的來說,開發,運行的速度似乎又快了不少,但Guice真的能不能扛起其所說的下一代IoC容器,我們拭目以待吧。


          posted on 2010-01-06 16:16 shiwf 閱讀(675) 評論(0)  編輯  收藏 所屬分類: 1.15 guice

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


          網站導航:
           
           
          Copyright © shiwf Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 英超| 赞皇县| 衡东县| 邢台县| 屯昌县| 江北区| 乐陵市| 时尚| 太仓市| 上饶市| 乐平市| 古丈县| 自贡市| 黔西县| 册亨县| 隆安县| 红安县| 巴东县| 巫山县| 温州市| 绥中县| 吐鲁番市| 商南县| 广昌县| 黄骅市| 西林县| 五河县| 海口市| 奇台县| 永春县| 民勤县| 婺源县| 威远县| 浪卡子县| 慈溪市| 尉氏县| 邵东县| 吉首市| 罗平县| 沿河| 和田县|