Google Guice,一個(gè)號(hào)稱比Spring快100倍的IOC容器。某不才,也愿意跟隨大家一起學(xué)習(xí)Guice的思想,如果能夠在此過(guò)程中有所收獲就達(dá)到了我們的目的。如果能夠深刻理會(huì)IOC背后的思想并能熟練掌握運(yùn)用,甚至寫出一個(gè)更棒的IOC容器那就更美好了。如果大家想學(xué)基礎(chǔ)教程的,可以參考前面的文章。
5 源碼目錄
我們從一份源碼清單開(kāi)始我們的Guice高級(jí)學(xué)習(xí)內(nèi)容。下面的目錄樹(shù)是Guice 2.0的源碼目錄。
C:\USERS\XYLZ\BOOKS\GUICE\GUICE-2.0-SRC
├─examples [guice的一個(gè)XML實(shí)例,主要描述從xml中加載bean的過(guò)程]
│ └─src
│ └─example
│ └─xml
├─extensions [guice的官方插件]
│ ├─assistedinject [guice注入的一個(gè)助手插件,這個(gè)插件可以幫助我們生成一個(gè)工廠對(duì)象,而我們能夠根據(jù)此工程對(duì)象生成我們所需要的實(shí)際對(duì)象]
│ │ ├─src
│ │ │ └─com
│ │ │ └─google
│ │ │ └─inject
│ │ │ └─assistedinject
│ │ └─test
│ │ └─com
│ │ └─google
│ │ └─inject
│ │ └─assistedinject
│ ├─grapher [guice的Graphviz插件,允許通過(guò)Graphviz來(lái)繪制guice對(duì)象的依賴關(guān)系圖形]
│ │ ├─src
│ │ │ └─com
│ │ │ └─google
│ │ │ └─inject
│ │ │ └─grapher
│ │ │ └─graphviz
│ │ └─test
│ │ └─com
│ │ └─google
│ │ └─inject
│ │ └─grapher
│ │ └─demo
│ ├─jmx [guice的jmx插件,這個(gè)可以很方便的將我們的服務(wù)發(fā)布成一個(gè)MBean,這樣就可以遠(yuǎn)程控制我們的服務(wù)了]
│ │ ├─src
│ │ │ └─com
│ │ │ └─google
│ │ │ └─inject
│ │ │ └─tools
│ │ │ └─jmx
│ │ └─test
│ │ └─com
│ │ └─google
│ │ └─inject
│ │ └─tools
│ │ └─jmx
│ ├─jndi [guice的jndi插件,這個(gè)可以將我們的服務(wù)注入到j(luò)ndi容器中,也算是guice與j2ee的一點(diǎn)聯(lián)系吧]
│ │ └─src
│ │ └─com
│ │ └─google
│ │ └─inject
│ │ └─jndi
│ ├─multibindings [guice的多綁定插件,允許綁定一系列的對(duì)象Set或者M(jìn)ap,從而可以一次性的獲取對(duì)象Set或者M(jìn)ap,當(dāng)然僅針對(duì)同一類型對(duì)象]
│ │ ├─src
│ │ │ └─com
│ │ │ └─google
│ │ │ └─inject
│ │ │ └─multibindings
│ │ └─test
│ │ └─com
│ │ └─google
│ │ └─inject
│ │ └─multibindings
│ └─throwingproviders [guice的一個(gè)異常處理插件,這個(gè)插件允許提供一個(gè)Provider來(lái)處理實(shí)例化類拋出的異常]
│ ├─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編譯依賴的第三方j(luò)ar包]
│ └─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測(cè)試代碼]
└─com
├─google
│ └─inject
│ ├─commands
│ ├─example
│ ├─internal
│ ├─matcher
│ ├─name
│ ├─spi
│ ├─tools
│ │ └─jmx
│ └─util
└─googlecode
└─guice
其實(shí)我們可以從guice的測(cè)試用例去學(xué)習(xí)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包和源碼外,還包括各個(gè)插件的jar包和源碼以及javadoc文檔。
這里需要特別說(shuō)明的是guice內(nèi)部使用了cglib-2.2.1-snapshot.jar和asm-3.1.jar,由于這兩個(gè)包非常常見(jiàn),為了不與其他jar包依賴的這兩個(gè)庫(kù)沖突,guice使用了jarjar來(lái)將這兩個(gè)庫(kù)包含在guice內(nèi)部的com.google.inject.internal.cglib包和com.google.inject.internal.asm包中。這個(gè)過(guò)程是在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的源碼目錄結(jié)構(gòu)大體如此(各個(gè)包和類的介紹在后面中會(huì)具體談到),下一節(jié)中我們開(kāi)始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 高級(jí)教程02 - Guice的IOC容器(1)©2009-2014 IMXYLZ
|求賢若渴