Spring Boot提供了RandomValuePropertySource帮助开发者在配置文件中直接生成随机值,它很多场景都有用武之地,比如密钥、测试用例等。这些随机值可以是整数,longs或字符串,我们只需要在配置文件中定义即可:
#随机字符串
buke.secret=${random.value}
#随机int类型数字
buke.number=${random.int}
#随机long类型数字
buke.bignumber=${random.long}
#随机最大值
buke.ten=${random.int(10)}
#随机范围值
buke.range=${random.int[1024,65536]}
需要注意的是,每次配置文件加载后(即SpringApplication
启动run
后),生成的随机数编程固定值,除非再次重启才会变更。
使用也简单,像如下代码一样,只需要在想要绑定自定义值的属性上添加注解@Value(value = "${property}")
即可。
@Value(value = "${buke.secret}")
public String secret;
使用@Value(“${property}”)注解方式注入配置属性有时候可能显得比较笨重麻烦,尤其是需要使用多个properties或需要使用的数据本身有层次结构的时候。为了控制和property项目配置,Spring Boot提供一个允许使用自定义beans的替代方法来使用properties。
/** * 自定义配置属性绑定实体 * @author 漆可 * @date 2017年9月12日 下午8:30:35 */
@Component
@ConfigurationProperties(prefix = "buke")
public class ConfigBean {
private String secret;
private int number;
private long bignumber;
private int less;
private int range;
//getters setters ...
}
我们写个接口,测试绑定效果:
@RestController
public class ProperfileController
{
@Autowired
ConfigBean configBean;
@RequestMapping("/test")
public Object test()
{
Map<String, Object> map = new HashMap<>();
map.put("secret", configBean.getSecret());
map.put("number", configBean.getNumber());
map.put("bignumber", configBean.getBignumber());
map.put("less", configBean.getLess());
map.put("range", configBean.getRange());
return map;
}
}
上述代码的只做了一件事情,获取在配置文件中定义的随机值,并通过接口放回给前端页面显示:
Spring Boot支持并推荐使用Yaml配置文件。Yaml是Json的一个超集,与properties相比,它拥有数据的层级结构,又比XMl文件结构简单。
注意字段分号:
后面要加一个空格,不然无法读取到该值。将上述application.properties文件改为Yaml格式的application.yml:
buke:
secret: ${random.value}
bignumber: ${random.long}
less: ${random.int(10)}
range: ${random.int[1024,65536]}
number: ${random.int}
需要指出的是,同级目录上,properties配置的属性会覆盖Yaml属性,而不是有些网上所说的Yaml覆盖前者。
Spring Boot允许外化(externalize)项目配置,即不依靠项目本身的文件就可以改变、覆盖的项目原先的配置文件内容,方便我们在不同的环境执行不同的配置内容。最常用的就是通过命令行修改配置参数。
在使用命令行运行jar包部署Spring Boot应用的时候,可以使用命令行设置属性值。
java -jar xxx.jar –server.port=8090
如上命令行通过使用–server.port属性设置xxx.jar应用的端口为8090。
在命令行运行时,采用--xxx=xxx
的格式设置设置属性值。连续的两个减号–就是对application.properties中的属性值进行赋值的标识。以上命令等价于我们在application.properties中添加属性server.port=8090
。可设置的的属性值可以是我们自己定义的,也可以是Spring Boot中默认的参数。
通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数也是一种不安全的行为。我们可以在程序的启动入口加上SpringApplication.setAddCommandLineProperties(false)
来禁用命令行传参。
spring会从以下位置加载application.properties或application.yml配置文件:
这个列表是按优先级排序的(列表中前面的将覆盖后面的)。
我们可以通过重写spring.config.name
的值来修改配置文件的名称application
。
通过命令修改配置文件名称:
$ java -jar xxx.jar --spring.config.name=myprofile
通过配置文件修改配置文件名称:
spring.config.name=myprofile
或者这样:
spring:
config:
name: myprofile
我们可以重写spring.config.location
指定配置文件具体的路径(目录位置或文件路径列表以逗号分割)。
$ java -jar xxx.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
如果spring.config.location
包含目录(相对于文件),必须以/
结尾表示该配置是个目录,在加载前,spring.config.name配置的文件名称会被追加到后面。
不管spring.config.location
配置的是什么值,默认的配置文件路径classpath:,classpath:/config,file:,file:config/
都会被使用。
这样可以方便开发者,在该路径路径设置一些默认值,然后在运行的时候使用不同的文件覆盖它,同时保留这些默认配置。
我们在开发web项目时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志级别,数据库地址、服务器端口。这就使得我们在打包的时候频繁的修改配置文件。
Profile配置,坊间戏称多环境配置,也叫隔离环境配置。它是一种强大的配置方式,解决了我们以往由于不同的环境配置频繁大量修改配置文件的问题。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties
的格式,其中{profile}
对应你的环境标识,比如:
- application-dev.properties:开发环境
- application-test.properties:测试环境
- application-prod.properties:生产环境
想要加载某个配置文件,只需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应指定配置文件的{profile}值。
spring.profiles.active=test
比如: 以上设置就会加载application-test.properties配置文件内容。
当然,也可以通过命令行指定具体配置文件。
java -jar xxx.jar --spring.profiles.active=test