一、@ConfigurationProperties
1、 在类定义上
@ConfigurationProperties
注解,此注解是用来为bean绑定属性。使用步骤如下:
-
在配置文件
application.yml
中,添加配置信息servers: ip-address: 127.0.0.1 port: 8123
-
创建配置类,并在配置类上添加注解
@ConfigurationProperties
,并配置prefix
,prefix
为配置文件中的前缀,即完成。package com.ty.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "servers") public class ServerConfig { private String ipAddress; private int port; }
-
最后,可以通过获取bean测试,配置信息已经注入。
package com.ty; import com.ty.config.ServerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class SpringbootConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args); ServerConfig bean = run.getBean(ServerConfig.class); System.out.println(bean); } }
2、 在方法定义上
@ConfigurationProperties
注解不仅能添加到类上,还可以添加到方法上,添加到类上是为spring容器管理的当前类的对象绑定属性,添加到方法上是为spring容器管理的当前方法的返回值对象绑定属性。案例如下:
-
在配置文件
application.yml
中,添加配置信息spring: datasource: password: 123 username: root
-
创建配置类,并通过
@Bean
定义bean,在对应的类上直接使用@ConfigurationProperties
进行属性绑定package com.ty.config; import com.ty.domain.TyDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DataSourceConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public TyDataSource dataSource(){ return new TyDataSource(); } }
-
最后,可以通过获取bean测试,配置信息已经注入。
package com.ty; import com.ty.config.ServerConfig; import com.ty.domain.TyDataSource; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class SpringbootConfigApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args); TyDataSource bean1 = run.getBean(TyDataSource.class); System.out.println(bean1); } }
3、 @EnableConfigurationProperties
注解
针对注解 @ConfigurationProperties
,既可以在类上,又可以在方法上,这样整体开发管理与定位可能会越发混乱。于是spring提供了一个新的注解 @EnableConfigurationProperties
注解,专门标注使用@ConfigurationProperties注解绑定属性的bean是哪些。
package com.ty;
import com.ty.config.DataSourceConfig;
import com.ty.config.ServerConfig;
import com.ty.domain.TyDataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
@EnableConfigurationProperties({ServerConfig.class})
public class SpringbootConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args);
ServerConfig bean = run.getBean(ServerConfig.class);
System.out.println(bean);
}
}
二、宽松、松散绑定
springboot进行编程时人性化设计的一种体现,即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。
- @ConfigurationProperties绑定属性时支持属性名宽松绑定,这个宽松体现在属性名的命名规则上
- @Value注解不支持松散绑定规则
- 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符
以下都兼容:
servers:
ipAddress: 192.168.0.2 # 驼峰模式
ip_address: 192.168.0.2 # 下划线模式
ip-address: 192.168.0.2 # 烤肉串模式
IP_ADDRESS: 192.168.0.2 # 常量模式
三、计量单位绑定
springboot充分利用了JDK8中提供的全新的用来表示计量单位的新数据类型
-
Duration:表示时间间隔,可以通过
@DurationUnit
注解描述时间单位,例如上例中描述的单位为小时(ChronoUnit.HOURS) -
DataSize:表示存储空间,可以通过
@DataSizeUnit
注解描述存储空间单位,例如上例中描述的单位为MB(DataUnit.MEGABYTES)
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut;
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize dataSize;
}
也可以使用 @Value
注解,对于计量单位,可以使用关键字“MB”、“KB”等将属性值转换为对应的字节数。
具体来说,可以在Java Bean的属性上使用@Value注解,将 “xx:0” 格式的配置文件属性值解析为对应的数值,并在后面加上“{unit}”表示计量单位。例如:
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
@Value("${size-limit:50}${size-unit:MB}")
private long sizeLimit;
}
四、数据校验
SpringBoot给出了强大的数据校验功能,可以有效的避免比如代码中需要int类型,配置中给了非法的数值的问题的发生。
在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架。
如使用Hibernate提供的校验框架来作为实现进行数据校验。Hibernate Validator 是一个基于 Bean Validation 规范的验证框架,提供了一系列的注解用于验证 Java Bean 的属性值。其常用的验证如下:
验证注解 | 说明 |
---|---|
@NotNull | 验证对象是否为空(null) |
@NotEmpty | 验证对象是否为空,长度必须大于0 |
@NotBlank | 验证字符串不为空,长度必须大于0,字符串中的空格不算 |
@Size | 验证对象是否在指定的范围之内(包括字符串、集合、Map和数组等) |
@Min | 验证数值是否大于等于指定值 |
@Max | 验证数值是否小于等于指定值 |
@DecimalMin | 验证 BigDecimal 和 BigInteger 是否大于等于指定值 |
@DecimalMax | 验证 BigDecimal 和 BigInteger 是否小于等于指定值 |
@Digits | 验证数值是否符合指定的数值格式(整数或小数) |
@Past | 验证日期是否在当前时间之前 |
@Future | 验证日期是否在当前时间之后 |
@Pattern | 验证字符串是否符合指定的正则表达式 |
案例如下:
-
引入 jar
javax.validation
和org.hibernate.validator
<!--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开启校验功能,并对具体的字段设置校验规则
package com.ty.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Max; import javax.validation.constraints.Min; @Data @Component @ConfigurationProperties(prefix = "user") @Validated public class UserConfig { @Max(value = 1000, message = "The max number can not exceed to 1000") private Integer number; @Min(value = 20, message = "The minimum age limit ") private Integer age; }
-
检验,在
application.yml
配置文件中配置不满足验证条件的数据时,报错提示如下:user: age: 18 number: 10