Spring boot系列:配置文件(二)

1、小试牛刀

1.1 随机数

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后),生成的随机数编程固定值,除非再次重启才会变更。

1.2 使用配置

使用也简单,像如下代码一样,只需要在想要绑定自定义值的属性上添加注解@Value(value = "${property}")即可。

 @Value(value = "${buke.secret}")
 public String secret;

1.3 绑定实体类

使用@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 ...
}

1.4 测试效果

我们写个接口,测试绑定效果:

@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系列:配置文件(二)_第1张图片

1.5 替换者Yaml

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覆盖前者。

2 通过命令行设置属性值

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)来禁用命令行传参。

3 应用的配置文件

3.1 应用文件的位置

spring会从以下位置加载application.properties或application.yml配置文件:

  1. 当前目录下的一个/config子目录
  2. 当前目录
  3. 一个classpath下的/config包
  4. classpath根路径(root)

这个列表是按优先级排序的(列表中前面的将覆盖后面的)。

3.2 修改配置文件名称

我们可以通过重写spring.config.name的值来修改配置文件的名称application

通过命令修改配置文件名称:

$ java -jar xxx.jar --spring.config.name=myprofile

通过配置文件修改配置文件名称:

spring.config.name=myprofile

或者这样:

spring: 
    config: 
        name: myprofile

3.3 修改配置文件路径

我们可以重写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/都会被使用。
这样可以方便开发者,在该路径路径设置一些默认值,然后在运行的时候使用不同的文件覆盖它,同时保留这些默认配置。

4、多环境配置

4.1 定义

我们在开发web项目时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志级别,数据库地址、服务器端口。这就使得我们在打包的时候频繁的修改配置文件。

Profile配置,坊间戏称多环境配置,也叫隔离环境配置。它是一种强大的配置方式,解决了我们以往由于不同的环境配置频繁大量修改配置文件的问题。

4.2 多环境配置的方法

在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

你可能感兴趣的:(spring-boot)