在看了官方的一些Demo和网上博客之后,发现关于SpringBoot 通过属性文件外置配置有些眼花缭乱,故写了一个专门的Demo。
本文使用的SpringBoot版本是1.4.5.RELEASE
第一种方式:使用@Value注解直接读取application.properties中配置的属性
Controller:
@RestController
public class UserController {
@Value("${my.user.name}")
private String name;
@GetMapping("/user/name")
public String getUserName() {
return name;
}
}
application.properties:
my.user.name=Richard-陈龙祥
但是该方式无法支持中文,中文会出现乱码,原因是Properties文件最终是使用Java Properties类的load方法读取,该方法使用的编码集是ISO 8859-1,要使用中文需要使用Unicode escapes
第二种方式:使用@Value注解直接读取application.yml中配置的属性
和上述的区别就是将application.properties重命名为application.yml
my.user.name: Richard-陈龙祥
yml文件默认使用UTF-8编码集,可以支持中文
第三种方式:@Value注解目前已经不怎么推荐使用了,SpringBoot提供属性Bean配置的方式
application.yml:
my.book.author: 罗贯中
my.book.name: 三国演义
my.book.price: 60
属性Bean:
@ConfigurationProperties(prefix = "my.book")
public class BookConfig {
private String name;
private String author;
private int price;
//getter setter
}
Controller:
@RestController
public class BookController {
@Autowired
private BookConfig bookConfig;
@GetMapping("/book")
public String getBook() {
return bookConfig.getAuthor() + " " + bookConfig.getName() + "" + bookConfig.getPrice();
}
}
需要配合@EnableConfigurationProperties注解
@EnableConfigurationProperties({BookConfig.class})
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
该方式当需要外置配置的属性过多时,将外置配置属性集中的application文件中不够优雅
第四种方式:使用独立的属性文件
my.book.properties:
my.book.author=罗贯中
my.book.name=三国演义
my.book.price=60
属性配置Bean:
@Configuration
@ConfigurationProperties(prefix = "my.book")
@PropertySource(value = "my.book.properties", encoding = "UTF-8")
public class BookConfig {
private String name;
private String author;
private int price;
//getter setter
}
使用@Configuration和@PropertySource组合的方式,因为@ConfigurationProeprties注解的location属性已经不推荐使用了,此处需要注意的是,若使用中文,需要指定@PropertySource的encoding属性值
而且此时不需要@EnableConfigurationProperties注解配合使用
目前推荐第四种方式,相比较而言比较优雅
具体的代码可以参考SpringBoot-Configuration-Demo 里面都有readme.txt,有具体解释,相信应该足够在一般项目中使用了