Zico源码分析:运行启动过程分析和总结

来源:互联网 发布:vx交友软件 编辑:程序博客网 时间:2024/04/29 09:42

其实已经有童鞋对Zico的源码和运行过程进行了总结,例如:http://www.cnblogs.com/shuaiwang/p/4522905.html。这里我再补充一些内容。当我们使用mvn install将Zico打包成war包后,将其解压后可以看到MANIFEST.MF文件中指定的主类是:com.jitlogic.zico.main.ZicoMain,简单看一下这个类,发现其主要作用是启动Jetty Web Server,并加载配置文件,实现一些安全配置。那么我们需要问了,这个war包是怎么实现trace数据的接收和处理的呢?我们下面简单分析一下:

我们注意到其web.xml中有较多关于resteasy的配置,按照网友博客上的介绍:RESTEasy是JBoss的开源项目之一,是一个RESTful Web Services框架。RESTEasy的开发者Bill Burke同时也是JAX-RS的J2EE标准制定者之一。

上面这段话的出处在这里:http://blog.csdn.net/rubyzhudragon/article/details/7355383,在这篇博客中,也给出了作者使用RESTEasy时的web.xml文件,进行一下对比,我们可以注意到,上面这篇博客中定义的listener是:org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap,而在Zico的设置中定义的是:com.jitlogic.zico.core.inject.ZicoRestBootstrapListener,对照一下源码,发现后者是继承了:org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener,通过类名可以猜测,实现的作用是差不多的。需要注意的是,从类名来看,这里使用了Guice这个框架,Guice是由Google大牛Bob Lee开发的一款绝对轻量级的java IoC容器。Bob Lee也被人称为“疯狂的Bob”,其Twitter ID是:@crazybob,哈哈,实在不知道这哥们为什么有这种称号,他已经于几年前从Google离职了。

言归正传,在RESTEasy的文档中也介绍了其对Guice的支持:http://docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html_single/index.html#Guice1,结合网友的介绍:http://blog.csdn.net/zhangzz1127/article/details/17428173,我们可以注意到,确实应该改成Zico中的那种配置。同样,根据官网,要实现IoC,需要在web.xml中指定注册服务类,在Zico中的配置如下:

<context-param>    <param-name>resteasy.guice.modules</param-name>    <param-value>com.jitlogic.zico.core.inject.ProdZicoModule</param-value></context-param>

这个类需要实例化com.google.inject.Module接口,并实现它的configure(Binder binder)方法,具体到Zico上的实现,我们可以看到,ProdZicoModule这个继承了AbstractZicoModule这个类,而后者确实实例化了上面这个接口。在这两个类的configure方法中都进行了一些依赖注入(或称翻转控制,IoC)的操作。

所以IoC这部分的过程就完全搞清楚了,下面再简单说说Zico是怎么启动接收数据等服务的,其实很简单,我们返回到刚才说的listener:com.jitlogic.zico.core.inject.ZicoRestBootstrapListener,稍微看看它的源码。

按照RESTEasy的Java Doc介绍:http://docs.jboss.org/resteasy/docs/3.0.9.Final/javadocs/org/jboss/resteasy/plugins/guice/GuiceResteasyBootstrapServletContextListener.html,对于类org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener而言,其子类需要Override其withInjector方法,并在方法内部和Injector对象进行交互,正是有了这种功能,所以通过这一句:

injector.getInstance(ZicoService.class).start();

我们实际上就调用了com.jitlogic.zico.core.ZicoService这个类的start方法,可以看到,在这里就实现了启动监听等功能,然后Zico的其他功能也就开始运行了(单从这个过程来看,我实在看不出IoC在这里面起到的作用)。相信通过这样的总结,大家能够对Zico的运行过程有一个稍深入的了解。

0 0
原创粉丝点击