文章目录
1. 高级配置
1.1 ConfigurationProperties
1.1.1 为自定义的Bean加载属性值
- 之前学习了@ConfigurationProperties注解,此注解的作用是用来为bean绑定属性的。开发者可以在yml配置文件中以对象的格式添加若干属性
servers:
ipAddress: 192.168.1.28
port: 6666
timeout: -1
- 开发一个用来封装数据的实体类
@Data
//自定义的Bean
@Component
public class ServerConfig {
private String ipAddress;
private int port;
private Long timeout;
}
- 使用@ConfigurationProperties注解就可以将配置中的属性值关联到开发的模型类上
@Data
//自定义的Bean
@Component
//类初始化加载yml配置中的数据
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private Long timeout;
}
- 添加测试
@SpringBootApplication
public class ConfigurationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ConfigurationApplication.class, args);
ServerConfig bean = context.getBean(ServerConfig.class);
System.out.println(bean);
}
}
1.1.2 为第三方的Bean加载属性值
- 使用@Bean注解定义第三方bean
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
//dataSource.setDriverClassName("com.mysql.jdbc.123");
return dataSource;
}
- 在yml中定义要绑定的属性,注意datasource此时全小写
dataSource:
driverClassName: com.mysql.jdbc
- 使用@ConfigurationProperties注解为第三方bean进行属性绑定,注意前缀是全小写的datasource
@Bean
@ConfigurationProperties(prefix = "datasource")
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
//dataSource.setDriverClassName("com.mysql.jdbc.123");
return dataSource;
- 添加测试
@SpringBootApplication
public class ConfigurationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ConfigurationApplication.class, args);
DruidDataSource dataSource = context.getBean(DruidDataSource.class);
System.out.println(dataSource.getDriverClassName());
}
}
OK,我们总结一下:@ConfigurationProperties注解不仅能添加到类上,还可以添加到方法上
- 添加到类上是为spring容器管理的当前类的对象绑定属性。
- 添加到方法上是为spring容器管理的当前方法的返回值对象绑定属性,其实本质上都一样。
1.1.3 @EnableConfigurationProperties注解
通过上面两个例子可以看出,目前我们定义bean不是通过类注解定义就是通过@Bean定义,使用@ConfigurationProperties注解可以为bean进行属性绑定,那在一个业务系统中,哪些bean通过注解@ConfigurationProperties去绑定属性了呢?因为这个注解不仅可以写在类上,还可以写在方法上,所以找起来就比较麻烦了。为了解决这个问题,spring给我们提供了一个全新的注解,专门标注使用@ConfigurationProperties注解绑定属性的bean是哪些。这个注解叫做@EnableConfigurationProperties。
-
配置类上开启@EnableConfigurationProperties注解,并标注要使用@ConfigurationProperties注解绑定属性的类
-
在对应的类上直接使用@ConfigurationProperties进行属性绑定
这里使用@EnableConfigurationProperties(ServerConfig.class)已经表明把我们的实体类ServerConfig设置为spring管理的bean了,因此,在实体类上我们就不需要再使用@Component注解了。
最后再提示一个信息,当我们使用@ConfigurationProperties注解时,会出现下面的提示信息
出现该提示只需要再pom.xml中添加一个坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
ok,@ConfigurationProperties相关知识已经解释完了。
总结
- 使用@ConfigurationProperties可以为使用@Bean声明的第三方bean绑定属性
- 当使用@EnableConfigurationProperties声明进行属性绑定的bean后,无需使用@Component注解再次进行bean声明
1.2 宽松绑定/松散绑定
什么是宽松绑定?实际上是springboot进行编程时人性化设计的一种体现,即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。兼容到什么程度呢?几乎主流的命名格式都支持,例如:
上面的例子中,在ServerConfig中的ipAddress属性名,使用yml配置文件我们的书写格式可以丰富多样化,例如以下四种皆可
# ipAddress: 192.168.1.28 #驼峰
# ip_address: 192.168.1.28 #下划线
ip-address: 192.168.1.28 #烤肉串,中划线(推荐)
# IP_ADDRESS: 192.168.1.28 #常量模式
同样在上述例子中,我们做一个小改动,将datasource改为dataSource
这时,我们发现idea报错了,我们运行一下看报错原因
然后再看我们写的名称dataSource,就不满足上述要求。闹了半天,在书写前缀时,这个词不是随意支持的,必须使用上述标准。
最后说一句,以上规则仅针对springboot中@ConfigurationProperties注解进行属性绑定时有效,对@Value注解进行属性映射无效。
使用@Valus注解命名必须和yml中保持一致,否则无法获取。
总结
- @ConfigurationProperties绑定属性时支持属性名宽松绑定,这个宽松体现在属性名的命名规则上
- @Value注解不支持松散绑定规则
- 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符
1.3 常用计量单位绑定
Duration:表示时间间隔,可以通过@DurationUnit注解描述时间单位
DataSize:表示存储空间,可以通过@DataSizeUnit注解描述存储空间单位
1.4 校验
目前我们在进行属性绑定时可以通过松散绑定规则在书写时放飞自我了,但是在书写时由于无法感知模型类中的数据类型,就会出现类型不匹配的问题,比如代码中需要int类型,配置中给了非法的数值,例如写一个“a",这种数据肯定无法有效的绑定,还会引发错误。
SpringBoot给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。书写应用格式非常固定,话不多说,直接上步骤。
- 开启校验框架,即导入相对应的坐标
<!-- 1.导入JSR303规范,这只是一个接口,还得导入它的实现类-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!-- 使用hibernate框架提供的校验器做实现类-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
-
在需要开启校验功能的类上使用注解@Validated开启校验功能
-
对具体的字段设置校验规则
一旦我们输入的端口号超过了8888,系统就会报错并给出设置的提示信息
总结
- 开启Bean属性校验功能一共3步:导入JSR303与Hibernate校验框架坐标、使用@Validated注解启用校验功能、使用具体校验规则规范数据校验格式
1.5 数据类型转换
例如,在开发者眼中“0123”是一个字符串,但是在springboot看来,这就是一个数字,而且是一个八进制的数字。当后台使用String类型接收数据时,如果配置文件中配置了一个整数值,他是先安装整数进行处理,读取后再转换成字符串。巧了,0123撞上了八进制的格式,所以最终以十进制数字83的结果存在了。
所以,使用数字字符串特别是以0开头注意使用双引号避免出错
这里提两个注意点,第一,字符串标准书写加上引号包裹,养成习惯,第二,遇到0开头的数据多注意吧。