目录
5.4 @ConfigurationProperties⾼级配置
步骤③:使⽤@ConfigurationProperties注解为第三⽅bean进⾏属性绑定,注意前缀是全⼩写的datasource
哪些bean通过注解@ConfigurationProperties去绑定属性了
步骤①:在引导类上开启@EnableConfigurationProperties注解,并标注要绑定属性的类
步骤②:在对应的类上直接使⽤@ConfigurationProperties进⾏属性绑定
2.在需要开启校验功能的类上使⽤注解@Validated开启校验功能
可以将java程序打包成jar, 在运⾏jar包的时候传递参数, 具体如下:
org.springframework.boot spring-boot-maven-plugin
打包完的jar包在target文件夹
java -jar 工程jar包路径 --变量=参数
原因:
在springboot的引导类的main方法中有一个args参数列表,它会传递给run方法,替换原来的在application.yml中的配置。如果删除这个args就无法传递临时变量
SpringBoot提供的4级配置⽂件中的其中⼀个级别。4个级别分别是:
上⾯4个⽂件的加载优先顺序为
1. file :config/application.yml 【最⾼】
2. file :application.yml
3. classpath:config/application.yml
4. classpath:application.yml 【最低】
SpringBoot会从这四个位置全部加载主配置⽂件,如果⾼优先级中配置⽂件属性与低优先级配置⽂件不冲突的属性,则会共同存在— 互补配置。
SpringBoot会加载全部主配置⽂件;互补配置:
备注:
这⾥说的配置⽂件,都还是项⽬⾥⾯。最终都会被打进jar包⾥⾯的,需要注意。
1、如果同⼀个⽬录下,有application.yml也有application.properties,默认先读取application.properties。
2、如果同⼀个配置属性,在多个配置⽂件都配置了,默认使⽤第1个读取到的,后⾯读取的不覆盖前⾯读取到的。
3、创建SpringBoot项⽬时,⼀般的配置⽂件放置在“项⽬的resources⽬录下”
项⽬在部署的时候,可能存在多个环境,我们有开发环境,测试环境,正式环境,但是配置都不相同,因此为了解决多环境配置⽂件不同的问题,我们可以有多个配置⽂件,来对不同的环境进⾏满⾜。
每个配置⽂件中写⾃⼰的配置,主配置⽂件中写清楚⽤哪⼀个配置⽂件就好了。
其他环境配置⽂件(例如开发dev、测试test、生产pro)
⽂件的命名规则为:application-环境名.yml。
⽐如⽣产环境配置如下:
application-pro.yml
spring: # 给配置文件命名 config: activate: on-profile: pro # 或者(可使用,但是已被弃用,不推荐) profiles: pro
主配置⽂件 application.yml
spring: profiles: # 使用一个配置文件pro active: pro # 或者 config: activate: on-profile: pro
在配置⽂件中,如果某些配置项所有环境都⼀样,可以将这些项写⼊到主配置中,只有哪些有区别的项才写⼊到环境配置⽂件中。
配置⽂件中的信息进⾏拆分,并制作成独⽴的配置⽂件,命名规则如下
⽅式1:
使⽤include属性在激活指定环境的情况下,同时对多个环境进⾏加载使其⽣效,多个环境间使⽤逗号分隔,include后面按序优先级递增(下面devMVC优先级最高)。include与active组合使用,include优先级高
spring: profiles: # 使用多个配置文件 include: devDB,devRedis,devMVC
⽅式2:
SpringBoot从2.4版开始使⽤group属性替代include属性,降低了配置书写量。
spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
如果使用@ConfigurationProperties注解报错:
需要引入一个依赖:
org.springframework.boot spring-boot-configuration-processor
注解@ConfigurationProperties指定该对象加载哪⼀组yaml中配置的信息,为bean绑定属性。
- @Bean
- public DruidDataSource datasource(){
- DruidDataSource ds = new DruidDataSource();
- return ds;
- }
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource")
- public DruidDataSource datasource(){
- DruidDataSource datasource = new DruidDataSource();
- return datasource;
- }
@ConfigurationProperties注解不仅能添加到类上,还可以添加到⽅法上,添加到类上是为spring容器管理的当前类的对象绑定属性,添加到⽅法上是为spring容器管理的当前⽅法的返回值对象绑定属性,其实本质上都⼀样。
spring给我们提供了⼀个全新的注解,专⻔标注使⽤@ConfigurationProperties注解绑定属性的bean是哪些。这个注解叫做@EnableConfigurationProperties。
使用步骤:
- @SpringBootApplication
- @EnableConfigurationProperties(UserInfo.class)
- public class SpringbootConfigurationApplication {
- }
- @Data
- @ConfigurationProperties(prefix = "servers")
- public class UserInfo {
- private String ip;
- private int port;
- }
使⽤@EnableConfigurationProperties注解时,spring会默认将其标注的类定义为bean,因此⽆需再次声明@Component注解了。
总结
1. 使⽤@ConfigurationProperties可以为使⽤@Bean声明的第三⽅bean绑定属性
2. 当使⽤@EnableConfigurationProperties声明进⾏属性绑定的bean后,⽆需使⽤
@Component注解再次进⾏bean声明
宽松绑定:实际上是springboot进⾏编程时⼈性化设计的⼀种体现,即配置⽂件中的命名格式与变量名的命名格式可以进⾏格式上的最⼤化兼容。
在yml配置文件中不管你用下面哪一种命名方式,都会去掉非字母字符转换成小写,从而绑定到类
- @Data
- @ConfigurationProperties(prefix = "userinfo")//必需全部小写才能绑定。不管配置文件中如何命名
- public class UserInfo {
- private String ip;
- private int port;
- }
userinfo:
userId: zhangsan # 驼峰模式
user_id: zhangsan # 下划线模式
user-id: zhangsan # 烤⾁串模式
USER_ID: zhangsan # 常量模式
以上4种模式最终都可以匹配到userId这个属性名 ,springboot官⽅推荐使⽤烤⾁串模式,也就是中划线模式。
总结
1. @ConfigurationProperties绑定属性时⽀持属性名宽松绑定,这个宽松体现在属性名的命名规则上
2. @Value注解不⽀持松散绑定规则
3. 绑定前缀名推荐采⽤烤⾁串命名规则,即使⽤中划线做分隔符
SpringBoot给出了强⼤的数据校验功能,可以有效的避免此类问题的发⽣。在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据⾃⼰的需要选择对应的校验框架,此处使⽤Hibernate提供的校验框架来作为实现进⾏数据校验。
javax.validation
validation-api
org.hibernate.validator
hibernate-validator
- @Component
- @Data
- @ConfigurationProperties(prefix = "userinfo")
- //开启对当前bean的属性注⼊校验
- @Validated
- public class UserInfo {
- }
- @Component
- @Data
- @ConfigurationProperties(prefix = "userinfo")
- @Validated
- public class UserInfo {
- //设置具体的规则
- @Max(value = 100,message = "最⼤值不能超过100")
- @Min(value = 0,message = "最⼩值不能低于0")
- private int id;
-
- @Size(max=5 ,min=2.message="address超过范围了")
- private String address;
- }
通过设置数据格式校验,就可以有效避免⾮法数据加载,其实使⽤起来还是挺轻松的,基本上就是⼀个格式。