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

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

          導航

          常用鏈接

          隨筆分類

          good blog author

          積分與排名

          • 積分 - 81738
          • 排名 - 700

          最新評論

          閱讀排行榜

           

          Guice真的無法享受企業級組件嗎,JavaEye里炮轟Guice的占絕大多數。但如果Guice能整合Spring,那么我們似乎可以做很多有意義的事了。那么開始Spring整合之旅吧。不過crazybob在整合方面極不配合,就給了我們一個單元測試類,然后讓我們自力更生。好在Guice本身足夠簡單。

           

          首先還是來一個最簡單無聊的HelloWorld整合吧。

           

          HelloWorld.java

          Java代碼
          1. package com.leo.domain;  
          2.   
          3. public class HelloWorld {  
          4.   
          5.     public String sayHello(String str) {  
          6.         return str;  
          7.     }  
          8. }  

          夠簡單了吧。

            

          現在開始編寫你的applicationContext.xml(如果不熟悉Spring的話,可能無法繼續往下看)。

          為保持簡潔,去掉了那一段DTD

           

          Xml代碼
          1. <beans>  
          2.     <bean id="helloWorld" class="com.leo.domain.HelloWorld" />  
          3. </beans>  

          好了,開始與Guice整合吧。

           Guice的核心就是com.google.inject.Module,它類似于Springbean工廠。 HelloWorldMyModule.java 

           

          Java代碼
          1. package com.leo.module;  
          2.   
          3. import static com.google.inject.spring.SpringIntegration.fromSpring;  
          4.   
          5. import org.springframework.beans.factory.BeanFactory;  
          6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
          7.   
          8. import com.google.inject.Binder;  
          9. import com.google.inject.Module;  
          10. import com.leo.domain.HelloWorld;  
          11.   
          12. public class HelloWorldMyModule implements Module {  
          13.     public void configure(Binder binder) {  
          14.         final BeanFactory beanFactory = new ClassPathXmlApplicationContext(  
          15.                 new String[] { "applicationContext.xml""daoContext.xml" });  
          16.         binder.bind(BeanFactory.class).toInstance(beanFactory);  
          17.         binder.bind(HelloWorld.class).toProvider(  
          18.                 fromSpring(HelloWorld.class"helloWorld"));  
          19.     }  
          20. }  

           

          其中:

           
          Java代碼
          1. final BeanFactory beanFactory = new ClassPathXmlApplicationContext(  
          2.                 new String[] { "applicationContext.xml""daoContext.xml" });  
          3.         binder.bind(BeanFactory.class).toInstance(beanFactory);  
           

           

           

          定義了GuiceSpring整合后,將spring工廠也由Guice托管。我感覺crazybob在與Spring整合事件上非常低調,給了個嚇死人的單元測試,而且沒有任何文檔,這個單元測試里的bean都是臨時動態注入進去的,不知道是因為出自對Spring XML配置的不滿,還是根本沒想到用Guice的人會去整合Spring,我個人感覺他在這一點上非常吝嗇。 注意這一句:

           

          Java代碼
          1. binder.bind(HelloWorld.class).toProvider(  
          2.                 fromSpring(HelloWorld.class"helloWorld"));  

           

          這與普通Guice本身托管的Bean注入不一樣,fromSpring很明顯說明這個bean來自于spring,而且與helloWorldapplicationContext.xml中定義的那個是一致的。

           

          好了,我們開始來個單元測試 

          HelloWorldTest.java

          Java代碼
          1. package com.leo.service;  
          2.   
          3. import junit.framework.TestCase;  
          4.   
          5. import com.google.inject.Guice;  
          6. import com.google.inject.Inject;  
          7. import com.google.inject.Injector;  
          8. import com.leo.domain.HelloWorld;  
          9. import com.leo.module.HelloWorldMyModule;  
          10.   
          11. /** 
          12.  * @author superleo 
          13.  */  
          14. public class HelloWorldTest extends TestCase {  
          15.   
          16.     @Inject  
          17.     private HelloWorld helloWorld;  
          18.   
          19.     public void testHelloWorld() {  
          20.         HelloWorldMyModule module = new HelloWorldMyModule(); // 建HelloWorldModule,生成Guice的bean工廠  
          21.         HelloWorldTest test = new HelloWorldTest();  
          22.         Injector in = Guice.createInjector(module);  
          23.         in.injectMembers(test); // 將HelloWorldTest所依賴的helloWorld注入進去  
          24.         System.out.println(test.helloWorld.sayHello("hey, hello-world"));  
          25.     }  
          26. }  
           

           

          代碼還是非常簡單。運行后,正常的結果會出來在控制臺上。但是這段代碼能說明什么,無非就是helloWorld不需要set,get方法,但還多加了一大堆什么Injector, Module之類的。實際上在GuiceStruts2整合后,這些硬編碼是不會出現的,而且如果不是因為與Spring整合,連Module里面配置HelloWorld都不要。但不是有人說Guice無法使用企業級組件嗎?就單純一個DI,根本就是玩具,但大家想想Guice能通過Spring來應用這些企業級組件的話,Guice還是有優勢的。因為它夠簡單,夠快,夠靈活,強類型,本身沒有XML(與其它框架整合,不能保證別的框架沒有),幾乎沒有學習曲線,文檔就一個HTML。因此,我現在想給大家運用JavaMail,這個算企業級常用的組件了吧?

           繼續編寫SpringapplicationContext.xml applicationContext.xml 

           

          Xml代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
          3.   
          4. <beans>  
          5.     <!-- Java Mail -->  
          6.     <bean id="mailSender"  
          7.         class="org.springframework.mail.javamail.JavaMailSenderImpl">  
          8.         <property name="host" value="smtp.163.com" />  
          9.         <!-- 有些郵件服務器發送郵件需要認證,所以必須提供帳號  -->  
          10.         <property name="username" value="kyo100900@163.com" />  
          11.         <property name="password" value="111111" />  
          12.         <property name="javaMailProperties">  
          13.             <props>  
          14.                 <prop key="mail.smtp.auth">true</prop>  
          15.             </props>  
          16.         </property>  
          17.     </bean>  
          18.   
          19.     <!--一個郵件模板(測試時使用)-->  
          20.     <bean id="mailMessage"  
          21.         class="org.springframework.mail.SimpleMailMessage">  
          22.         <property name="to" value="superleo_cn@hotmail.com" />  
          23.         <property name="from" value="kyo100900@163.com" />  
          24.         <property name="subject" value="fdsfdsfsdfsd" />  
          25.     </bean>  
          26.   
          27. </beans>  

           

           

           

          上面就是大家在Spring配置文件里寫爛了的代碼,別的什么整合代碼同理,就不多說了。 這時候,我們寫一個JavaMailModule 

          JavaMailModule.java

           

          Java代碼
          1. package com.leo.module;  
          2.   
          3. import static com.google.inject.spring.SpringIntegration.fromSpring;  
          4.   
          5. import org.springframework.beans.factory.BeanFactory;  
          6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
          7. import org.springframework.mail.MailSender;  
          8. import org.springframework.mail.SimpleMailMessage;  
          9. import org.springframework.mail.javamail.JavaMailSenderImpl;  
          10.   
          11. import com.google.inject.Binder;  
          12. import com.google.inject.Module;  
          13.   
          14. public class JavaMailModule implements Module {  
          15.   
          16.     public void configure(Binder binder) {  
          17.         final BeanFactory beanFactory = new ClassPathXmlApplicationContext(  
          18.                 new String[] { "applicationContext.xml"});  
          19.         binder.bind(BeanFactory.class).toInstance(beanFactory);  
          20.         binder.bind(SimpleMailMessage.class).toProvider(  
          21.                 fromSpring(SimpleMailMessage.class"mailMessage"));  
          22.   
          23.         binder.bind(MailSender.class).toProvider(  
          24.                 fromSpring(JavaMailSenderImpl.class"mailSender"));  
          25.     }  
          26.   
          27. }  

           

           

           

          HelloWorld一樣,只是分別換成了mailMessage, mailSender。寫到這里大家肯定明白了,GuiceSpring整合其實非常非常簡單。

           

          寫個測試吧:

          JavaMail.java

           

          Java代碼
          1. package com.leo.util;  
          2.   
          3. import org.springframework.mail.MailSender;  
          4. import org.springframework.mail.SimpleMailMessage;  
          5.   
          6. import com.google.inject.Guice;  
          7. import com.google.inject.Inject;  
          8. import com.google.inject.Injector;  
          9. import com.leo.module.MyModuleSpring;  
          10.   
          11. public class JavaMail {  
          12.   
          13.     @Inject  
          14.     private MailSender mailSender;  
          15.   
          16.     @Inject  
          17.     private SimpleMailMessage mailMessage;// 郵件模板  
          18.   
          19.     public void sendMail() {  
          20.   
          21.         System.out.println("-----------發送郵件!---------");  
          22.         mailMessage.setText("send maiiiiiiiiiiiiiiiil~~~~~~~~~~~~~~~~~~");  
          23.         try {  
          24.             System.out.println(mailSender.toString());  
          25.             mailSender.send(mailMessage);  
          26.         } catch (Exception e) {  
          27.             e.printStackTrace();  
          28.         }  
          29.         System.out.println("-----------發送成功!---------");  
          30.     }  
          31.   
          32.     public static void main(String... strings) {  
          33.         MyModuleSpring spring = new MyModuleSpring();  
          34.         JavaMail mail = new JavaMail();  
          35.         Injector in = Guice.createInjector(spring);  
          36.         in.injectMembers(mail);  
          37.         mail.sendMail();  
          38.     }  
          39. }  

          只要用戶名密碼正確,沒有設置什么代理,防火墻之類的,就能正常的運行,但大家如果測試的時候,請把電子郵件改改。至于說與Hibernate,事務等整合,已經出了wrap框架了,有興趣可以看看robbin寫的Warp framework - 一個相當有前途的Java框架》。 因此Guice不是完全不可能使用所謂的企業級組件的,直接使用Spring就可很容易做到。那么在應用Guice的時候,我感覺可以單獨建立一個SpringModule,將Guice無法做到的事通過Spring工廠來幫你組裝,其它方面,比如說Struts2ActionService層之間的注入等,直接用@Inject就得了,不要那么多set,get(Struts2需要放入到值棧的屬性例外)我們項目大多數Action超過幾千行了,光set,get就幾百行。Spring配置文件估計拼在一起也有幾千行,但所謂注入到的其它企業級組件還不到5個,剩下全是service,dao,action等等。就算Spring可以autowire,也不是解決問題的根本。 


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

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


          網站導航:
           
           
          Copyright © shiwf Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 基隆市| 昌平区| 达日县| 广安市| 新野县| 绥中县| 平武县| 井陉县| 房山区| 泰来县| 乐山市| 阿克苏市| 株洲市| 渭源县| 黔东| 星子县| 桓台县| 天台县| 枞阳县| 同江市| 大同市| 虎林市| 策勒县| 呼图壁县| 正定县| 德江县| 姚安县| 雷波县| 江永县| 衢州市| 嘉黎县| 营山县| 北辰区| 竹溪县| 壶关县| 绥棱县| 衡东县| 蓬安县| 淳化县| 新巴尔虎左旗| 漳浦县|