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體系。
參考資源:
- Google Guice
- Spring
- Google Guice 入門教程01 - 依賴注入(1)
- Martin Fowler:Inversion of Control Containers and the Dependency Injection pattern
- Graphviz
- jmx
- jndi
- Servlet
- Struts 2
- junit
- jarjar
上一篇:
Google Guice 入門教程08 - 整合第三方組件(2)
下一篇:
Google Guice 高級教程02 - Guice的IOC容器(1)©2009-2014 IMXYLZ
|求賢若渴