有时,我们可能想优化数据集合的检索(例如从数据库中),以便这些集合中的数据只有在真正要被使用时才检索。
实际上,这可以应用于任何数据块,但是考虑到内存中集合的大小,在这种情况下,检索要迭代的集合是最常见的情况。
为了支持这一点,Thymeleaf 提供了一种机制来延迟加载上下文变量。实现 ILazyContextVariable 接口的上下文变量——很可能是通过扩展其 LazyContextVariable 的默认实现——将在执行时被解析。例如:
context.setVariable( "users", // 通过继承 LazyContextVariable 来实现延迟加载功能 new LazyContextVariable<List<User>>() { @Override protected List<User> loadValue() { // 我们需要实现的方法 return databaseRepository.findAllUsers(); } });
这个变量不需要了解自己是延迟加载变量,它与普通的变量没有任何区别,可以直接在模板代码中使用。如下:
<ul> <li th:each="u : ${users}" th:text="${u.name}">user name</li> </ul>
但同时,如果条件 ${condition} 为 false,则将永远不会被初始化 users 变量(它的 loadValue() 方法将永远不会被调用),例如:
<ul th:if="${condition}"> <li th:each="u : ${users}" th:text="${u.name}">user name</li> </ul>