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;
** 从这一章节开始,才进入真正的springboot2.1学习**
属性配置是springboot中比较常用且重要的功能,很多自定义的配置及自动装配都依赖该功能
假设我们这里使用@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"
首先将启动参数中的–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需要将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))
更多内容参见官网:官方属性配置教程
使用类型安全的属性注入方式支持数据检验
我们为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.
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;