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
|求贤若渴