大概了解了下velocity的东西,把过程中自己不理解以及自己的一些总结写成文档。可能有些部分不对,或者部分我不理解的地方,还请发现者指正,非常感谢。我邮箱 [email protected]。
velocity中不理解的几个地方
1、 模式使用上有点乱,不过不影响代码层次。(个人理解)
2、 资源文件加载的时候,ResourceLoader 是所有的ResourceLoader都尝试一遍,如果抛异常则进行下一个加载,如果正确返回则直接返回。这样的设计感觉不是很合理。当然默认只加载FileRourceLoader的情况下是可以进行,但如果加载多个Loader,会不会开销有点大呢??
3、 Introspector中的cache无大小限制??
4、 为何在RuntimeInstance中定义Introspetor,又使用uberspect中Introspector。不是很明白RuntimeInstance中定义的intropsetor是做什么的,实际应用使用uberspect中的是不是就足够了呢??
5、 SimplePool(parsePool)中put方法,相当于需要业务控制pool的put的大小,那这个其实可以自己控制。
6、 主要的核心对象都有对RuntimeService的引用,如果直接使用Velocity访问是不是更好呢???
7、 Parser这块的代码好难看懂。只是明白分解的目的和结果,但代码没能看懂。
Velocity要学习的地方
1、 单例的控制,使用RuntimeSingleton控制,可以很好地节约new对象等额外的开销。
2、 配置信息统一集中管理,全局通用,可以很好的管理、扩展。
3、 使用了缓存,例如parsepool默认缓存大小20,ResourceCache默认大小89.可以提高效率。在做自己业务的时候,多考虑缓存的使用。
4、 使用了不少设计模式,整体来说对实现、代码层次帮助很大。
需要主要的地方
1、只可以初始化一次
扩展自己定义velocity配置
Velocity的扩展通过是配置属性,所以需要实现扩展信息并添加到配置中即可。
1、 自定义Director
继承velocity的Directive超类,然后将实现类的路径添加到userdirective。使用“,”分割多个自定义director。如:
Velocity.addProperty("userdirective","com.wobfei.velocity.WobfeiDirective");
2、 自定义EventHandler
eventHandler主要由ReferenceInsertionEventHandler、ReferenceInsertionEventHandler、MethodExceptionEventHandler、IncludeEventHandler、InvalidReferenceEventHandler组成,对应不同的event。实现自己需要定义的接口,并将其路径添加到相应的配置信息下,变量名为:eventhandler.referenceinsertion.class
eventhandler.nullset.class
eventhandler.methodexception.class
eventhandler.include.class
3、 自定义增加resourceLoader
默认只加载FileResourceLoader,如果需要加载其它resourceLoader,则增加配置(这里以增加JarResourceLoader为例)
Velocity.addProperty("resource.loader", "jar,file");
Velocity.addProperty("jar.resource.loader.description",
"Velocity Jar Resource Loader");
Velocity.addProperty("jar.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.JarResourceLoader");
Velocity.addProperty("jar.resource.loader.path",
"jar:file:D:/work/lib/ij.jar!/");
Velocity.addProperty("jar.resource.loader.cache", "false"); Velocity.addProperty("jar.resource.loader.modificationCheckInterval", "2");
4、 修改其它配置。
velocity默认的配置可查看org.apache.velocity.runtime.defaults.velocity.properites文件,如果要替换默认配置,只需要使用Velocity.addProperty方法替换即可。必须是在初始化方法之前,否则不会生效,Velocity默认只能加载一次。
核心类图
1、 核心类图-整体
2、 resourceManager类图如下
3、velocimacroFacatory如下
4、uberspect、introspector如下