|
在JAXP中透明的缓存XSL转换器(7) # Specifies transformer factory implementation Javax.XML.transform.TransformerFactory=de.fzi.dbs.transform.CachingTransformerFactory ... 最后一个方法是通过Services API在原信息(meta-information)中提供transformer factory名。只需要在META-INF/services目录中创建一个叫做Javax.XML.transform.TransformerFactory的文件。这个文件的内容应该是一个指定了定制的transformer factory类名的单行字符串。这种方法有一个问题:另一个JAR可能也尝试通过Services API设置factory类。例如,如果你把你的JAR和Saxon’s JAR放入你的Web应用的WEB-INF/lib目录,实际上JAXP使用的factory将会根据JAR文件的载入顺序确定。避免这种问题的方法是简单的将factory设置在WEB-INF/classes/META-INF/services/Javax.XML.transform.TransformerFactory文件中。在本文情况中,该文件需要包含一个单行字符串de.fzi.dbs.transform.CachingTransformerFactory。 使缓存可以透明的使用 现在,当一切都完成后。你没那么头痛了。你不再需要担心载入、缓存和重新载入样式表。你可以确保使用标准JAXP的第三方库可以很好的使用缓存功能。你可以肯定不会再有并发冲突,缓存也不会是瓶颈。 可是,使用这个实现仍然有一些缺点。首先,这个factory只缓存基于文件的样式表。原因是我们可以很容易的查看文件的最后修改的日期,但其他资源并不都能实现这个功能。另一个问题是样式表import和include其他样式表。修改了被import和include的样式表并不会使主样式表重新载入。最后,扩展一个现有的factory实现将你绑在了一个特定的XSLT Processor(除非你为每个一个你可能使用的factory都写一个缓存扩展)。不过,值得高兴的一点是,大部分情况下,这些问题比起我们从基于factory的缓存中获得的:使用透明、方便、高性能来说无关紧要。 关于作者 Alexey Valikov是一个具有广泛编程背景的电脑科学家,特别是Java和XML技术。他现在在FZI(电脑科学研究中心,Karlsruhe/Germany)研究“Web应用中的效率问题”。他工作于FZI的XML Competence Center,他同时担任XML技术顾问,并且参与了European Commission research projects。Alexey是一本很受欢迎的XSLT应用指南“The Technology of XSLT”的作者,该书出版于俄罗斯。 资源 |