spring boot 2.1学习笔记【四】属性配置

springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。springboot系列代码全部上传至GitHub:https://github.com/liubenlong/springboot2_demo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;

文章目录

  • 常规属性配置
    • @value
      • 启动参数
      • application.properties
  • 类型安全的属性配置(强烈推荐)
    • YMAL
  • 多种多样的属性配置
  • 配置校验 valid
    • @ConfigurationProperties vs. @Value
  • profile:针对不同环境使用不同配置

** 从这一章节开始,才进入真正的springboot2.1学习**

属性配置是springboot中比较常用且重要的功能,很多自定义的配置及自动装配都依赖该功能

常规属性配置

@value

假设我们这里使用@value来注入name:

@RestController
@Slf4j
public class HelloController {
    @Value("${name}")
    private String name;

    @GetMapping("/properties1")
    public String properties1() {
        log.info("name={}", name);
        return "Welcome to springboot2 world ~";
    }
}

启动参数

可以在项目启动时设置启动参数,@value可以将值注入到name:
在这里插入图片描述

上图中,我们设置参数:--name="zhangsan",启动项目,调用http://127.0.0.1:8080/properties1接口,可以看到日志中输出2018-12-30 15:04:31.699 INFO 12456 --- [nio-8080-exec-1] com.example.controller.HelloController : name=zhangsan
springboot的项目我们一般会将其打成一个jar包执行,那么也可以通过在执行jar包时传入:
java -jar springboot2demo-1.0-SNAPSHOT.jar --name="lisi"
在这里插入图片描述

application.properties

首先将启动参数中的–name删除,以避免影响到我们接下来的测试。

stu.name=zhangsan
stu.age=10

上面定义了两个变量,我们修改HelloController.java如下:

 @Value("${stu.name}")
    private String name;
    @Value("${stu.age}")
    private String age;

    @GetMapping("/properties1")
    public String properties1() {
        log.info("name={}, age={}", name, age);
        return "Welcome to springboot2 world ~";
    }

执行结果:name=zhangsan, age=10

类型安全的属性配置(强烈推荐)

上述只是简单的举例,但是实际项目中如果全都这样写,会比较麻烦,而且容易类型出错,故官方建议使用类型安全的属性配置,借助实体类进行注入,方便使用且类型更加安全。

新建Stu类:

import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "stu") //指定前缀为stu
@Data
@ToString
public class Stu {
    private String name;
    private int age;
}

在controller中这样使用:

@Autowired
private Stu stu;

@GetMapping("/properties1")
public String properties1() {
    log.info("stu={}", stu);
    return "Welcome to springboot2 world ~";
}

运行结果:stu=Stu(name=zhangsan, age=10)}

这样就可以防止数据配置错误,而且使用简单。如果将age设置为字符串则启动会报错:
在这里插入图片描述

YMAL

目前比较流行ymal, 固接下来都会使用ymal来进行配置。使用ymal需要将application.properties文件名称改为application.yml(yaml也可以)。

stu:
  name=lisi
  age=20

重启 服务,输出结果是一样的。

接下来的配置我们将使用YMAL及类型安全的方式进行演示。

多种多样的属性配置

简单起见,这里我就直接一次性编写到一个实体类了,大家可以根据下面实例代码自行尝试

下面展示简单数据类型和复杂数据类型:
编写person.java:

import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
    //各种普通数据类型
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    //复杂类型展示
    private Map<String,Object> map;
    private List<Object> list;
    private List<Dog> dogs;
    private Stu stu;
}

stu.java:

@Component
@ConfigurationProperties(prefix = "stu")
@Data
@ToString
public class Stu {
    private String name;
    private int age;
}

dog/java

@Component
@Data
@ToString
public class Dog {
    private String name;
    private double weight;
}

application.yml;

person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2018/05/04 01:02:21
  map: {k1: v1,k2: v2}
  list:
  - lisi
  - good
  dogs:
  - dog:
    name: aaa
    weight: 15
  - dog:
    name: ccc
    weight: 16
  #上面是KV写法,下面是行内写法
  stu: {name: lisi, age: 21}

stu:
  name: zhangsan
  age: 18

HelloController:

 @Autowired
    private Stu stu;
    @Autowired
    private Person person;


    @GetMapping("/properties1")
    public String properties1() {
        log.info("stu={}", stu);
        log.info("person={}", person);
        return "Welcome to springboot2 world ~";
    }

运行结果:

stu=Stu(name=zhangsan, age=18)

person=Person(
lastName=zhangsan, 
age=18, 
boss=false, birth=Fri May 04 01:02:21 CST 2018, 
map={k1=v1, k2=v2}, 
list=[lisi, good], 
dogs=[Dog(name=aaa, weight=15.0), Dog(name=ccc, weight=16.0)], 
stu=Stu(name=lisi, age=21))

更多内容参见官网:官方属性配置教程

配置校验 valid

使用类型安全的属性注入方式支持数据检验
我们为Person的部分属性添加校验:

@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
@Validated  //对数据进行校验
public class Person {
    //各种普通数据类型
    @NotEmpty
    private String lastName;
    @Range(min = 0, max = 10)
    private Integer age;
    //省略代码

再次启动服务,发现启动失败,因为age配置了18 ,大于10.

@ConfigurationProperties vs. @Value

在这里插入图片描述

profile:针对不同环境使用不同配置

springboot默认使用application.yml中的配置。我们可以在application.yml中使用spring.profiles.active=prod来指定环境配置。也可以在执行过程中通过命令传递--spring.profiles.active=prod。当指定了文件后,如果有相同的配置,那么指定的文件中的配置是有效的。

在这里插入图片描述

application-prod.yml:

stu:
  name: 镇关西
  age: 30

application-dev.yml:

stu:
  name: 武松
  age: 29

application.yml添加:

# 这个stu之前就有的,而且三个文件中都有
stu:
  name: zhangsan
  age: 18

# 指定使用哪个文件
spring:
  profiles:
    active: dev

运行程序输出:

stu=Stu(name=武松, age=29)
person=Person(lastName=zhangsan, age=18, boss=false, birth=Fri May 04 01:02:21 CST 2018, map={k1=v1, k2=v2}, list=[lisi, good], dogs=[Dog(name=aaa, weight=15.0), Dog(name=ccc, weight=16.0)], stu=Stu(name=lisi, age=21))

读者可以尝试修改上述dev为prod观察结果。

springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。springboot系列代码全部上传至GitHub:https://github.com/liubenlong/springboot2_demo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;

你可能感兴趣的:(spring,boot,2.X/spring,cloud,Greenwich)