在开发 Spring Boot 项目时,我们可能会有每次启动应用时需要指定一个随机端口,而不是一个固定的端口。或者,项目每次启动生成一个随机的KEY,客户端需要通过这个 KEY 来验证身份。
要实现上面两个需求其实还是很简单的,我们可以自定义 WebServerFactoryCustomizer 实现端口随机生成。代码如下:
import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory factory) { // 随机生成 8000 ~ 9000 之间的端口 factory.setPort( (int)(Math.random()*1000) + 8000 ); } }
关于怎样使用 WebServerFactoryCustomizer 来自定义端口,请参考 配置服务端口。至于生成随机 KEY 那就更简单了,在应用启动时使用 UUID 生成一个 KEY 即可。
在 Spring Boot 中,配置文件支持配置随机数和随机KEY。在注入随机值(例如:密钥或测试用例)时 RandomValuePropertySource 很有用,它能产生整数,longs或字符串。比如:
(1)生成一个随机 KEY,例如:
my.secret=${random.value}
生成结果:f87be1cbcf2312cf1b20a8b6c72ad1c7
(2)生成一个随机 int 值,例如:
my.number=${random.int}
(3)生成一个随机 long 值,例如:
my.bignumber=${random.long}
(4)生成小于 10 的 int 随机值,例如:
my.number.less.than.ten=${random.int(10)}
(5)生成位于 1024 和 65536 之间的随机值,例如:
my.number.in.range=${random.int[1024,65536]}
random.int 的语法是 OPEN value (,max) CLOSE ,此处 OPEN,CLOSE 可以是任何字符,并且 value,max 是整数。如果提供 max ,那么 value 是最小 值, max 是最大值(不包含在内)。
注意:在上面定义的随机值可以在 Bean 中通过 @Value 注解引用,例如:
// my.secret=${random.value} @Value("${my.secret}") private String mySecret; // my.number=${random.int} @Value("${my.number}") private int myNumber; // my.bignumber=${random.long} @Value("${my.bignumber}") private long myBigNumber; // my.number.less.than.ten=${random.int(10)} @Value("${my.number.less.than.ten}") private int myNumberLessThanTen; // my.number.in.range=${random.int[1024,65536]} @Value("${my.number.in.range}") private int myNumberInRange;