接着上一篇的属性自定义配置继续。
5,应用程序的Bean外置
假定有一天,我们这个小程序需要需要留一下作者的联系方式 email,Tel和website,这两个属性又不想硬编码,这个时候,我们就可以把这个属性放在任意一个spring boot 支持的属性源之中,我还是继续放到application.properties中吧。
打开application.properties文件,增加下面两个属性值。
contact.email=273232805@qq.com
contact.tel=18112345678
contact.web-site=https://blog.csdn.net/davidguoliu
增加后的效果如下图所示:
现在我们如何把这个配置的属性传递给Thymeleaf模板中呢?
首先, 我们定义一个名为ContactProperties.java的类,这个类有3个属性email,tel和webSite,但这不是重要的,最重要的是这个类用@ConfigurationProperties注解开启了配置属性,开启了配置属性后,spring boot 就会到属性源中去找到属性值并注入到ContactProperties类中。
@ConfigurationProperties( prefix = "contact") prefix说明,ContactProperties中的属性应该从前缀为contact的属性源属性中注入。不仅如此,Spring Boot 的属性解析器还非常智能,能把驼峰命名的属性和使用下划线或者连接符的同名属性自动关联起来,webSite属性就是和很好的例子。
package com.example.myreadlist;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import sun.reflect.generics.tree.VoidDescriptor;
@Component
@ConfigurationProperties( prefix = "contact")
public class ContactProperties {
private String email;
private String tel;
public String webSite;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWebSite() {
return webSite;
}
public void setWebSite(String webSite) {
this.webSite = webSite;
}
}
其次,我们需要在Controller中把属性值放入到Model模型中。
@RequestMapping(value = "/{reader}",method = RequestMethod.GET)
public String readersBooks(@PathVariable("reader") String reader, Model mode){
List<Book> readList=readListRepository.findByReader(reader);
if(readList!=null) {
mode.addAttribute("books", readList);
mode.addAttribute("email",this.contactProperties.getEmail());
mode.addAttribute("tel",this.contactProperties.getTel());
mode.addAttribute("website",contactProperties.getWebSite());
}
return "readlist";
}
最后,我们在Thymeleaf模板中绑定一下即可。
<p>
<span th:text="'Email:'+${email}"></span>
<span th:text="' Tel'+${tel}"></span>
<span th:text="' WebSite:'+${website}"></span>
</p>
现在运行应用程序,就可以看到刚开始第一张图中描述的样子了。