Spring Boot 控制器如何知道 return 小胡子模板而不是字符串

How does a SpringBoot controller know to return a mustache template instead of a String

我正在穿过 tutorial on Spring Boot using Kotlin。我是 Kotlin 和 Spring 的新手,尽管我已经在其他语言的几个不同的 MVC 风格框架中工作过,所以请理解要点。

我在完成本教程时没有得到的是这些控制器方法中的方式:

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController(private val repository: ArticleRepository) {

    @GetMapping("/")
    fun blog(model: Model): String {
        model["title"] = "Blog"
        model["articles"] = repository.findAllByOrderByAddedAtDesc().map {
            it.render()
        }
        return "blog"
    }
}

我们在末尾看到 return "blog" 的地方 Spring 知道 return 带有所提供模型的小胡子模板。

我本来期望像 return MustacheView("blog", model)(我知道这不是真正的 class 或方法,只是伪编码来举例)或类似的东西,你明确地说“嘿 return 这是一个小胡子模板,而不仅仅是字符串 blog"..

我敢肯定在幕后有一些魔法 spring 说“哦嘿,你安装了 mustache 依赖项,当你 return 来自控制器的这个字符串时你必须引用模板名称”,但我在文档中看不到它的拼写位置。

完成本教程并不完全需要知道,但目前感觉有点无法解释的魔法,我想知道发生了什么。

当你return一个String时,它被用作视图名称。此视图名称则为 resolved into a View implementation.

对于 Mustache,Spring 引导会自动配置一个 MustacheViewResolver bean。这个 bean 然后被 Spring MVC 拾取并用于将你的 "blog" 变成一个由你的 Mustache 模板支持的 MustacheView。然后它与传递到您的控制器方法并呈现的 Model 组合。