xylz,imxylz

          關注后端架構、中間件、分布式和并發編程

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

          Google Guice,一個號稱比Spring快100倍的IOC容器。某不才,也愿意跟隨大家一起學習Guice的思想,如果能夠在此過程中有所收獲就達到了我們的目的。如果能夠深刻理會IOC背后的思想并能熟練掌握運用,甚至寫出一個更棒的IOC容器那就更美好了。如果大家想學基礎教程的,可以參考前面的文章

          5 源碼目錄

          我們從一份源碼清單開始我們的Guice高級學習內容。下面的目錄樹是Guice 2.0的源碼目錄。

          C:\USERS\XYLZ\BOOKS\GUICE\GUICE-2.0-SRC
          ├─examples [guice的一個XML實例,主要描述從xml中加載bean的過程]
          │  └─src
          │      └─example
          │          └─xml
          ├─extensions [guice的官方插件]
          │  ├─assistedinject [guice注入的一個助手插件,這個插件可以幫助我們生成一個工廠對象,而我們能夠根據此工程對象生成我們所需要的實際對象]
          │  │  ├─src
          │  │  │  └─com
          │  │  │      └─google
          │  │  │          └─inject
          │  │  │              └─assistedinject
          │  │  └─test
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─assistedinject
          │  ├─grapher [guice的Graphviz插件,允許通過Graphviz來繪制guice對象的依賴關系圖形]
          │  │  ├─src
          │  │  │  └─com
          │  │  │      └─google
          │  │  │          └─inject
          │  │  │              └─grapher
          │  │  │                  └─graphviz
          │  │  └─test
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─grapher
          │  │                      └─demo
          │  ├─jmx [guice的jmx插件,這個可以很方便的將我們的服務發布成一個MBean,這樣就可以遠程控制我們的服務了]
          │  │  ├─src
          │  │  │  └─com
          │  │  │      └─google
          │  │  │          └─inject
          │  │  │              └─tools
          │  │  │                  └─jmx
          │  │  └─test
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─tools
          │  │                      └─jmx
          │  ├─jndi [guice的jndi插件,這個可以將我們的服務注入到jndi容器中,也算是guice與j2ee的一點聯系吧]
          │  │  └─src
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─jndi
          │  ├─multibindings [guice的多綁定插件,允許綁定一系列的對象Set或者Map,從而可以一次性的獲取對象Set或者Map,當然僅針對同一類型對象]
          │  │  ├─src
          │  │  │  └─com
          │  │  │      └─google
          │  │  │          └─inject
          │  │  │              └─multibindings
          │  │  └─test
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─multibindings
          │  └─throwingproviders [guice的一個異常處理插件,這個插件允許提供一個Provider來處理實例化類拋出的異常]
          │      ├─src
          │      │  └─com
          │      │      └─google
          │      │          └─inject
          │      │              └─throwingproviders
          │      └─test
          │          └─com
          │              └─google
          │                  └─inject
          │                      └─throwingproviders
          ├─javadoc [guice的javadoc文檔]
          │  ├─com
          │  │  └─google
          │  │      └─inject
          │  │          ├─assistedinject
          │  │          ├─binder
          │  │          ├─jndi
          │  │          ├─matcher
          │  │          ├─multibindings
          │  │          ├─name
          │  │          ├─servlet
          │  │          ├─spi
          │  │          ├─spring
          │  │          ├─throwingproviders
          │  │          ├─tools
          │  │          │  └─jmx
          │  │          └─util
          │  └─resources
          ├─lib [guice編譯依賴的第三方jar包]
          │  └─build
          ├─servlet [guice的Servlet插件]
          │  ├─lib
          │  │  └─build
          │  ├─src
          │  │  └─com
          │  │      └─google
          │  │          └─inject
          │  │              └─servlet
          │  └─test
          │      └─com
          │          └─google
          │              └─inject
          │                  └─servlet
          ├─spring [guice的Spring插件]
          │  ├─src
          │  │  └─com
          │  │      └─google
          │  │          └─inject
          │  │              └─spring
          │  └─test
          │      └─com
          │          └─google
          │              └─inject
          │                  └─spring
          ├─src [guice的核心代碼]
          │  └─com
          │      └─google
          │          ├─common
          │          │  ├─base
          │          │  └─collect
          │          └─inject
          │              ├─binder
          │              ├─internal
          │              ├─jndi
          │              ├─matcher
          │              ├─name
          │              ├─spi
          │              ├─tools
          │              │  └─jmx
          │              └─util
          ├─struts2 [guice的Struts 2插件]
          │  ├─example
          │  │  ├─root
          │  │  │  └─WEB-INF
          │  │  │      └─classes
          │  │  └─src
          │  │      └─com
          │  │          └─google
          │  │              └─inject
          │  │                  └─struts2
          │  │                      └─example
          │  ├─lib
          │  └─plugin
          │      └─src
          │          └─com
          │              └─google
          │                  └─inject
          │                      └─struts2
          └─test [guice的junit測試代碼]
              └─com
                  ├─google
                  │  └─inject
                  │      ├─commands
                  │      ├─example
                  │      ├─internal
                  │      ├─matcher
                  │      ├─name
                  │      ├─spi
                  │      ├─tools
                  │      │  └─jmx
                  │      └─util
                  └─googlecode
                      └─guice

          其實我們可以從guice的測試用例去學習guice的用法,這里就不談了。

          首先我們編譯guice的源碼。

          ant dist

          我們看看生成的文件。

          C:\USERS\XYLZ\BOOKS\GUICE\GUICE-2.0-SRC\BUILD
          │  classes.bar
          │  guice-2.0-src.jar
          │  guice-2.0-src.zip
          │  guice-2.0.zip
          │  guice-with-deps.jar
          │ 
          ├─classes
          │  └─com
          ├─dist
          │  │  aopalliance.jar
          │  │  COPYING
          │  │  guice-2.0.jar
          │  │  guice-assistedinject-2.0-src.jar
          │  │  guice-assistedinject-2.0.jar
          │  │  guice-jmx-2.0-src.jar
          │  │  guice-jmx-2.0.jar
          │  │  guice-jndi-2.0-src.jar
          │  │  guice-jndi-2.0.jar
          │  │  guice-multibindings-2.0-src.jar
          │  │  guice-multibindings-2.0.jar
          │  │  guice-servlet-2.0-src.jar
          │  │  guice-servlet-2.0.jar
          │  │  guice-spring-2.0-src.jar
          │  │  guice-spring-2.0.jar
          │  │  guice-struts2-plugin-2.0-src.jar
          │  │  guice-struts2-plugin-2.0.jar
          │  │  guice-throwingproviders-2.0-src.jar
          │  │  guice-throwingproviders-2.0.jar
          │  │ 
          │  └─javadoc
          ├─javadoc
          ├─javadoc-core
          └─META-INF
                  MANIFEST.MF

          在這里我們可以看到除了生成guice的jar包和源碼外,還包括各個插件的jar包和源碼以及javadoc文檔。

          這里需要特別說明的是guice內部使用了cglib-2.2.1-snapshot.jar和asm-3.1.jar,由于這兩個包非常常見,為了不與其他jar包依賴的這兩個庫沖突,guice使用了jarjar來將這兩個庫包含在guice內部的com.google.inject.internal.cglib包和com.google.inject.internal.asm包中。這個過程是在common.xml中的如下段完成的。


          <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"

          classpath
          ="${common.basedir}/lib/build/jarjar-1.0rc8.jar"/>

          <jarjar jarfile="${build.dir}/${ant.project.name}-with-deps.jar">

          <fileset dir="${build.dir}/classes"/>

          <zipfileset src="${common.basedir}/lib/build/cglib-2.2.1-snapshot.jar"/>

          <zipfileset src="${common.basedir}/lib/build/asm-3.1.jar"/>

          <rule pattern="net.sf.cglib.**" result="com.google.inject.internal.cglib.@1"/>

          <rule pattern="org.objectweb.asm.**" result="com.google.inject.internal.asm.@1"/>

          <keep pattern="com.google.inject.**"/>

          </jarjar>

          Guice的源碼目錄結構大體如此(各個包和類的介紹在后面中會具體談到),下一節中我們開始Guice的IOC體系。

          參考資源:

          1. Google Guice
          2. Spring
          3. Google Guice 入門教程01 - 依賴注入(1)
          4. Martin Fowler:Inversion of Control Containers and the Dependency Injection pattern
          5. Graphviz
          6. jmx
          7. jndi
          8. Servlet
          9. Struts 2
          10. junit
          11. jarjar
          上一篇: Google Guice 入門教程08 - 整合第三方組件(2)
          下一篇: Google Guice 高級教程02 - Guice的IOC容器(1)

          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2010-01-04 23:45 imxylz 閱讀(29229) 評論(0)  編輯  收藏 所屬分類: Google Guice

          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 承德县| 哈尔滨市| 南汇区| 万源市| 台州市| 仁布县| 丰顺县| 潢川县| 仙桃市| 乌苏市| 文水县| 余干县| 石狮市| 阿瓦提县| 陵水| 历史| 磐石市| 岑溪市| 岗巴县| 樟树市| 安陆市| 平顺县| 酒泉市| 苍梧县| 克山县| 威信县| 隆昌县| 武义县| 鹤岗市| 商丘市| 金昌市| 霸州市| 聂拉木县| 沧源| 承德县| 大足县| 江华| 佳木斯市| 黄梅县| 内江市| 都江堰市|