之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍Resource相关初始化,本文内容涉及到的概念比较多,也是velocity中比较重要的一部分初始化内容,期间设计到代码使用的template等概念。
还是先以一张类图开始,如图1:
(图1)
ResourceManager在初始化时主要加载了velocity.properites中资源相关的配置,初始化RuntimeInstance中的ResourceManager属性,以下罗列几个加载配置:
# ---------------------------------------------------------------------------- # RESOURCE MANAGEMENT # ---------------------------------------------------------------------------- # Allows alternative ResourceManager and ResourceCache implementations # to be plugged in. # ---------------------------------------------------------------------------- resource.manager.class = org.apache.velocity.runtime.resource.ResourceManagerImpl resource.manager.cache.class = org.apache.velocity.runtime.resource.ResourceCacheImpl # ---------------------------------------------------------------------------- # T E M P L A T E L O A D E R S # ---------------------------------------------------------------------------- # # # ---------------------------------------------------------------------------- resource.loader = file file.resource.loader.description = Velocity File Resource Loader file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader file.resource.loader.path = .,/home/madding/vm file.resource.loader.cache = false file.resource.loader.modificationCheckInterval = 2一块是反射方式初始化 resource manager,一块初始化具体的resourceLoader,本例子中简单修改file.resource.loader.path,添加另一个模板加载位置,把模板在“当前目录”或者/home/madding/vm下,都能被加载到。
说明:
1.ResourceManager的初始化直接关联到的对象是resource对象的创建,经常使用的是template对象的创建,调用的就是ResourceManager的resourceLoader对象进行传教的
2.ResourceManager在初始化resourceLoader根据具体的配置加载,可以初始化多个配置,存在List中,在间接生成Resource对象后,循环调用加载器加载具体的模板。
3.resourceLoader有几个实现方式,一般web工程中使用fileResourceLoader,即根据具体路径加载vm文件。
4.ResourceCache是控制资源加载的缓存设置,根据velocity.properties文件内容加载配置,主要是减少每次加载,缓存实现采用的是LinkedHashMap和ConcurrentHashMap实现。
5.ResourceFactory是构建资源对象的工厂类,该类接口设计不是很合理,不过不影响功能,主要是代码构建Resource对象,每次new出一个Resource对象。在实际调用中,该对象加载后会存在ResourceCache中,之所以要保存这个信息,主要是因为Resource对象在解析时会消耗大量计算(因为要构建ast树,tree),所以保存起来,空间换时间。
至此:RuntimeInstance中
private ResourceManager resourceManager = null;属性初始化了。