前言
只是简单的properties配置学习,修改部分“约定”改为自定义“配置”。真正使用和遇到问题是在细看。
一、主要
核心只是demo中的: @PropertySource(value = "classpath:/config/custom.properties", ignoreResourceNotFound = true)
二、demo
// application 注解@Configuration@ComponentScan@EnableAutoConfiguration@PropertySource(value = "classpath:/config/custom.properties", ignoreResourceNotFound = true)// Controller 注解@Controllerpublic class PropertiesController { @Value("${CONSTANT_PASSWORD}") private String password; @Autowired private ConfigBean configBean; @RequestMapping("/custom") public String custom(@RequestParam(value="name", required=false, defaultValue="${CONSTANT_USER}") String name , Model model) { model.addAttribute("name", name); model.addAttribute("password", password); System.out.println(configBean); return "custom"; } public static void main(String[] args) { SpringApplication.run(PropertiesController.class, args); }}
config/custom.properties
## 常量配置CONSTANT_USER=vergiylnCONSTANT_PASSWORD=中文123## thymeleaf 配置spring.thymeleaf.prefix=classpath:/templates/properties/spring.thymeleaf.suffix=.htmlspring.thymeleaf.mode=HTML5spring.thymeleaf.encoding=UTF-8spring.thymeleaf.content-type=text/html # set to false for hot refreshspring.thymeleaf.cache=false
config/ConfigBean.properties 注入bean配置(日期暂时不知道怎么注入)
vergilyn.map[blog]=http://www.cnblogs.com/VergiLyn/vergilyn.map[name]=VergiLynvergilyn.map[remark]=备注,中文23333vergilyn.list[0]=Carpentersvergilyn.list[1]=Celine Dionvergilyn.list[2]=Bon Jovivergilyn.list[3]=Taylor Swiftvergilyn.str=stringvergilyn.num=124vergilyn.date=2017-01-14 23:55:19vergilyn.isSuccess=false
properties对应的JavaBean
@Configuration// prefix = value,看源码@ConfigurationProperties(prefix = "vergilyn")@PropertySource("classpath:config/ConfigBean.properties")@Componentpublic class ConfigBean implements Serializable{ private String str; private Integer num;// 注意:要是setIsSuccess(),不能是setSuccess()
private boolean isSuccess;
// 日期不知道怎么注入
// private Date date; private Mapmap; private List list; public String getStr() { return str; } public void setStr(String str) { this.str = str; } public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Boolean isSuccess() { return isSuccess; } public void setIsSuccess(Boolean success) { isSuccess = success; }}
custom.html
测试properties
测试结果:
二、扩展
1、idea中注入properties中文乱码。
起初,我以为需要*.properties或者*.xml或者别的什么配置中要配置编码,但发现并不是。
参考:
2、注入属性类型。
如demo,基本上string、int是可以的,不用多余的配置。但测试date并不知道怎么注入。
特别需要注意的是isSuccess;生成的set是setSuccess(),但properties中确实isSuccess导致注入失败。
3、@ConfigurationProperties中可以设置前缀
Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ConfigurationProperties { @AliasFor("prefix") String value() default ""; @AliasFor("value") String prefix() default ""; boolean ignoreInvalidFields() default false; boolean ignoreNestedProperties() default false; boolean ignoreUnknownFields() default true; boolean exceptionIfInvalid() default true; /** @deprecated */ @Deprecated String[] locations() default {}; /** @deprecated */ @Deprecated boolean merge() default true;}
如源码,可以看出prefix与value是一样的。
4、thymeleaf 表达式、方言
${...}:变量表达式;
*{...}:选择变量表达式;
#{...}:消息表达式;
@{...}:链接url表达式
有待了解,现在还不清楚具体是什么、如何使用、什么时候用。
参考:
附录