Spring boot 如何将 Thymeleaf 视图解析器放入其 bean 容器中

Posted

技术标签:

【中文标题】Spring boot 如何将 Thymeleaf 视图解析器放入其 bean 容器中【英文标题】:How does Spring boot put Thymeleaf view resolver into its bean container 【发布时间】:2019-10-24 12:42:52 【问题描述】:

这是一个spring boot项目,网页由Thymeleaf渲染。当我将 spring-boot-starter-thymeleaf 放入 pom.xml 并启动应用程序时,它试图在其容器中找到所有实现 ViewResolver 的 bean。你在这里看到它找到了thymeleafViewResolver。

我只是好奇 Spring boot 何时以及如何将这个 ThymeleafViewResolver 类放入其 bean 容器中?

【问题讨论】:

【参考方案1】:

这是由于 SpringBoot auto-configuration 特性会自动基于 different conditions 动态创建一个 bean,例如是否可以从类路径中找到一个库,或者开发人员是否已经定义了某种类型的 bean 等。 .

如果您通过将 debug=true 放入 application.properties 来打开调试模式,它将在应用程序启动期间打印出一份报告,说明哪些 bean 是由于哪些条件而自动创建的。

spring-boot-starter-thymeleaf 的示例中,您可以从报告中找到以下内容:

ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration#thymeleafViewResolver matched:
                  - @ConditionalOnMissingBean (names: thymeleafViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)

并通过追踪ThymeleafViewResolverConfiguration的源代码:

@Bean
@ConditionalOnMissingBean(name = "thymeleafViewResolver")
public ThymeleafViewResolver thymeleafViewResolver() 
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(this.templateEngine);
    resolver.setCharacterEncoding(this.properties.getEncoding().name());
    //.......   
    return resolver;

您会发现thymeleafViewResolver 属于ThymeleafViewResolver 类型,而@ConditionalOnMissingBean 意味着只有在尚未定义ThymeleafViewResolver 类型的bean 时才会创建此bean。

【讨论】:

非常感谢。我搜索了很多页面来研究自动配置。真的很酷! 对于您的帖子,您指的是哪个版本的自动配置? ThymeleafViewResolverConfiguration 的内容和我的版本有点不同,是spring-boot-autoconfigure-1.5.17.RELEASE.jar 我用的是2.1.X版本但是思路是一样的。

以上是关于Spring boot 如何将 Thymeleaf 视图解析器放入其 bean 容器中的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:如何将thymeleaf转换为jsp

如何将布局方言添加到spring-boot thymeleaf自动配置文件

我如何将 angularjs 与 spring boot 和 thymeleaf 一起使用?有模板项目吗? [关闭]

如何从 Spring Boot 中找到 Thymeleaf 模板

如何在 Spring Boot 中使用 Thymeleaf 保存角色?

如何使用 spring-boot 和 thymeleaf 设置标准 i18n 语言环境?