1.application.yml
配置文件增加配置
person:
pid: 1
pname: 小明
2.增加实体类接收,并把这个实体类注入到spring容器中(不然直接new的实体类是不会有值的)
@Data
@Component
public class Person {
@Value("${person.pid}")
private Integer pid;
@Value("${person.pname}")
private String pname;
}
@RestController
@RequestMapping("/demo")
@Slf4j
public class PersonController {
@Resource
Person person;
@RequestMapping("/showPerson")
public void showPerson() {
log.info(person.toString());
}
}
3.访问请求,则结果如图
1.上面其他部分不变,只需实体类修改一下
@Data
@Component
@ConfigurationProperties(prefix = "person") //表示配置的整体前缀
public class Person {
private Integer pid;//成员变量名称要和yml配置项key一一对应
private String pname;
}
其实,还可以通过SpEl在读取时,进行相关数据操作,再映射到对应的属性上,这个后续再了解
我们都知道配置文件是需要开发人员手动来修改的,只要是人为参与就会有出错的可能。为了避免人为配置出错的可能,我们需要对配置属性值做校验。
比如:
我们不能等到程序上线之后,才发现相关的配置错误。所以我们通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。
那么如何优雅的对参数进行校验呢?JSR303就是为了解决这个问题出现的
javax.validation
是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接口,没有具体实现
。
Hibernate-Validator
是一个hibernate独立的包,可以直接引用,他实现了javax.validation
同时又做了其他扩展,比较强大
。SpringBoot在内部集成了hibernate-validation,可以直接使用。
校验规则注解是在JSR 303(java)规范中定义的,但是JSR 303只是一个规范,并没有很多比较具体的实现。目前通常都是使用hibernate-validator进行统一参数校验,hibernate-validator是对JSR 303规范的实现。
java和javax都是Java的API(Application Programming Interface)包,java是核心包,javax的x是extension的意思,也就是扩展包。
因为spring-boot-starter-web包中已经包含了Hibernate-Validator 依赖,如图:
@Data
@Component
@ConfigurationProperties(prefix = "person") //表示配置的整体前缀
@Validated
public class Person {
private Integer pid;//成员变量名称要和yml配置项key一一对应
@NotBlank(message = "也可以定制信息")
private String pname;
@Min(18)
private Integer page;
}
配置文件修改,如下
person:
pid: 1
pname:
page: 22
@size (min=6, max=20, message="密码长度只能在6-20之间")
@pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\.[a-za-z]{2,4}", message="请输入正确的邮件格式")
@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")
@Email(message = "请输入正确的邮箱")
@NotNull(message = "用户名称不能为空")
@Max(value = 100, message = "年龄不能大于100岁")
@Min(value= 18 ,message= "必须年满18岁!" )
@AssertTrue(message = "bln4 must is true")
@AssertFalse(message = "blnf must is falase")
@DecimalMax(value="100",message="decim最大值是100")
@DecimalMin(value="100",message="decim最小值是100")
@NotNull(message = "身份证不能为空")
@Pattern(regexp="^(\d{18,18}|\d{15,15}|(\d{17,17}[x|X]))$", message="身份证格式错误")
spring boot项目使用(2)-- javax.validation
有一些老的项目里面的jar包并未主动的去与spring boot 融合,很多jar包都有自己的配置文件。如果我们在spring boot项目中使用这些jar包就必须得使用它们的配置文件,那就面临一个问题:我们的spring boot项目默认只有一个全局配置文件:application.yml或application.properties。该如何加载额外的配置文件?
@PropertySource(value = {"classpath:person.properties"})
public class Person{
注意:这个注解不支持加载yml文件,若要支持,需要自己增加一个配置类
在spring boot应用入口启动类上加@ImportResource(locations = {“classpath:beans.xml”}),该注解用来加载Spring XML配置文件。
我们开发的服务通常会部署在不同的环境中,例如开发环境、测试环境,生产环境等,而不同环境需要不同的配置。最典型的场景就是在不同的环境下需要连接不同的数据库,需要使用不同的数据库配置。我们期待实现的配置效果是:
Spring Boot 默认的配置文件是 application.properties(或yml)。那么如何实现不同的环境使用不同的配置文件呢?一个比较好的实践是为不同
1.application.yml是默认使用的配置文件,在其中通过spring.profiles.active设置使用哪一个配置文件,下面代码表示使用application-prod.yml配置,如果application-prod.yml和application.yml配置了相同的配置,比如都配置了运行端口,那application-prod.yml的优先级更高
2.IDEA启动
VM options设置启动参数 -Dspring.profiles.active=prod
Program arguments设置 --spring.profiles.active=prod
Active Profile 设置 prod
java -jar spring-boot-profile.jar --spring.profiles.active=prod
spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件.数值越小的标号优先级越高。
file:./config/ (当前项目路径config目录下);
file:./ (当前项目路径下);
classpath:/config/ (类路径config目录下);
classpath:/ (类路径下).
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。假如我们在上面的四个配置文件分别设置server.port=6666、7777、8888、9999。然后启动应用,最终的启动端口为6666,因为file:./config/ (当前项目路径config目录下配置文件)优先级是最高的。
自定义改变全局配置文件的加载位置:(优先级最高)
我们也可以通过配置spring.config.location来改变默认配置。
java -jar ./boot-launch-1.0.jar --spring.config.location=D:/application.yml
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置
SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
其实大家关于配置的优先级不用特别的去记忆。用到的时候查一下、体验一下、一般来说:特殊指定配置(命令行、环境变量)大于通用配置、外部配置优先级高于内部配置、局部环境配置(带profile)大于全局普适性配置。