1. Guzz是什么?
百度Guzz http://baike.baidu.com/link?url=2ILIi8BXdhEUrVmVkYIDoYbehSN-jZ4F83iyJtNhl40zECi8_T7n_Br9acqJhKVhIdoxiyWh9sw2feqGJvq8la
2. 感觉Guzz的资料还是太少,但是还是有一篇很完整的帮助文档:
http://code.google.com/p/guzz/wiki/TutorialGuzzXml?wl=zh-Hans
3. 自己学习Guzz的时间也不长,由于资料比较少,所以就只有直接看源码,在这里记录下过程,供以后查看。
4. Guzz容器初始化的流程图:
5. 接着对应着流程图来查看源码:
5.1 首先servlet容器在初始化的时候会读取到我们在web.xml中的配置:
<listener> <listener-class> org.guzz.web.context.spring.GuzzWithSpringContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>所以直接就会执行到GuzzWithSpringContextLoaderListener。
5.2 在GuzzWithSpringContextLoaderListener中,首先去初始化了spring的容器,由于我们在applicationContext.xml中配置了guzzContext:
<!--GUZZ声明--> <bean id="guzzContext" class="org.guzz.web.context.spring.GuzzContextBeanFactory" factory-method="createGuzzContext"> <constructor-arg> <value>classpath:guzz.xml</value> </constructor-arg> </bean>在spring初始化的时候肯定是会创建guzzContext对象的,所以进入到了GuzzContextBeanFactory,只有一个方法把guzz.xml又传入到Configuration,然后调用newGuzzContext()
public static GuzzContext createGuzzContext(Resource springResource) throws Exception{ File file = springResource.getFile() ; if(file == null){ throw new IOException("file is null. spring resource:" + springResource) ; } return new Configuration(file.getAbsolutePath()).newGuzzContext() ; }在newGuzzContext中创建了guzz中很重要的一个类对象GuzzContextImpl,然后调用了initFromMainConfig,传入了一个Resource(其实也就是guzz.xml)
public GuzzContext newGuzzContext() throws Exception{ GuzzContextImpl gf = new GuzzContextImpl() ; gf.initFromMainConfig(this.config) ; if(autoCloseResource){ CloseUtil.close(config) ; } return gf ; }5.3 在initFromMainConfig就是主要的初始化过程,主要是解析guzz.xml,初始化数据库数据类型,连接ConfigServer读取配置,初始化Service,初始化事务管理。内容很多,会在后面文章分析。
ApplicationContext applicationContext = org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext() ; GuzzContextImpl gc = (GuzzContextImpl) applicationContext.getBean("guzzContext") ; if(gc == null){ throw new GuzzException("spring bean [guzzContext] not found.") ; } //必须在spring初始化完毕以后才能调用。 SpringExtendedBeanFactory ebf = new SpringExtendedBeanFactory(applicationContext) ; gc.setExtendedBeanFactory(ebf) ; //启动guzz if(context == null){ context = new ContextLoader() ; try { context.initGuzzContext(sc, gc) ; } catch (Exception e) { log.error("can't start guzz.", e) ; context = null ; onLoadError(e) ; } }5.5 到此guzz初始化过程完成。这也只是一个大体的过程,很多的细节实现都是在GuzzContextImpl的initFromMainConfig里面