Thymeleaf 的工作得益于一组解析器 —— 针对标记和文本 —— 将模板解析为事件序列(打开标签、文本、关闭标签、注释等),以及一系列处理器 —— 针对需要应用的每一种行为类型,修改模板解析的事件序列,以便通过将原始模板与我们的数据相结合来输出我们期望的结果。
默认情况下,Thymeleaf 还包括一个存储解析模板的缓存;在处理模板文件之前读取和解析模板文件所产生的事件序列。这在 web 应用程序中特别有用,并基于以下概念:
(1)输入/输出几乎总是任何应用程序中最慢的部分。相比之下,内存中的处理是非常快的。
(2)克隆一个现有的内存中的事件序列总是比读取一个模板文件,解析它并为它创建一个新的事件序列要快得多。
(3)Web 应用程序通常只有几十个模板。
(4)模板文件一般是不会太大的,而且在应用程序运行时不会被修改。
上面的这一切导致了这样一个想法:在一个 Web 应用中对最常用的模板进行缓存是可行的,而不会浪费大量的内存,同时也会节省大量的时间,而这些时间会花在对一小部分文件的输入/输出操作上,事实上,这些文件永远不会改变。
那么我们怎样才能控制这个缓冲区呢?首先,我们之前已经知道,我们可以在模板解析器处启用或禁用它,甚至只作用于特定的模板:
// Default is true templateResolver.setCacheable(false); templateResolver.getCacheablePatternSpec().addPattern("/users/*");
另外,我们可以通过建立自己的缓存管理器对象来修改其配置,这个对象可以是默认的 StandardCacheManager 实现的实例。
// Default is 200 StandardCacheManager cacheManager = new StandardCacheManager(); cacheManager.setTemplateCacheMaxSize(100); ... templateEngine.setCacheManager(cacheManager);
请参考 org.thymeleaf.cache.StandardCacheManager 的 javadoc API,了解更多关于配置缓存的信息。
注意,我们可以手动从模板缓存中删除条目,例如:
// 彻底清除缓存 templateEngine.clearTemplateCache(); // 从缓存中清除一个特定的模板 templateEngine.clearTemplateCacheFor("/users/userList");