|
在JAXP中透明的缓存XSL转换器(2) TransformerFactory transFact = TransformerFactory.newInstance(); Templates cachedXSLT = transFact.newTemplates(xsltSource); Transformer trans = cachedXSLT.newTransformer(); 在这个示例中,xsltFile的transformation首先被载入cachedXSLT Templates对象。然后这个对象被用于创建新的transformer对象trans。这样使用的优势在于当我们需要另一个transformer对象时,解析和编译过程可能会被跳过。 Transformer anotherTrans = cachedXSLT.newTransformer(); 尽管这个技巧肯定会提高性能(特别是当重复使用相同的样式表时,比如在Web应用中),坦白的讲,它对于开发者来说并不方便。原因是除基于Templates的transformer实例外,你还必须注意样式表的最后更新时间,重新载入过期(outdated)的transformations,提供安全的并且在多线程访问样式表时仍具有高效率的缓存,还很多其他的细节。甚至将需要的功能封装进一个单独的transformer缓存实现也无法帮助使用第三方模块的开发者。一个很好的例子就是JSTL x:transform标记:当前在org.apache.taglibs.standard.tag.common.XML.TransformSupport和org.apache.taglibs.standard.tag.el.XML.TransformTag类中直接用TransformerFactory的newTransformer(…)方法。很明显,x:transform无法借助外部的缓存实现来提高性能 不过还是有一个简单的、不错的方法来解决这个问题的。JAXP始终允许我们替代其Transformer Factory,那我们为什么不写一个具有caching能力的factory来解决这个问题呢? 这个主意并不难实现。我们可以扩展任何一个合适的TransformerFactory(我使用Michale Key的Saxon 7.3)并且重载父类的newTransformer(…)方法使从基于文件的StreamSources中载入的transmations可以被缓存并从缓存中读取。当然,前提是transmations在载入后没有被修改。下面是一个新版本的newTransformer(…)方法: public Transformer newTransformer(final Source source)
|