SpringBoot实用篇二(高级配置)
1、@ConfigurationProperties(prefix = " ”)
创建ServerConfig
实体类
/**
* 项目名称:SpringBootProject
* 描述:属性类
*
* @author zhong
* @date 2022-05-26 6:35
*/
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private Integer port;
private String ipAddress;
private long timeout;
}
获取属性【设置属性值】
servers:
port: 8080
ipAddress: 198.168.0.1
timeout: -1
在引导类里面获取到
@SpringBootApplication
public class Springboot12ConfigurationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Springboot12ConfigurationApplication.class, args);
ServerConfig bean = run.getBean(ServerConfig.class);
System.out.println(bean);
}
启动的时候,就会将配置里面设置的属性输出
@ConfigurationProperties(prefix = " ”)为第三方bean数据绑定
-
导入druid坐标
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
-
配置文件设置
datasource: driverClassName: com.mysql.jdbc.Driver
-
引导类设置
@SpringBootApplication public class Springboot12ConfigurationApplication { @Bean @ConfigurationProperties(prefix = "datasource") public DruidDataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); // dataSource.setDriverClassName("123"); return dataSource; } public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot12ConfigurationApplication.class, args); ServerConfig bean = run.getBean(ServerConfig.class); DruidDataSource druidbean = run.getBean(DruidDataSource.class); System.out.println(druidbean.getDriverClassName()); // com.mysql.jdbc.Driver System.out.println(bean); } }
可以在对象里面自定义设置
set
的值,也可以通过@ConfigurationProperties(prefix = "datasource")
注解绑定
比较
// 具体的做属性绑定,必须有`@Component`注解设置bean
@ConfigurationProperties(prefix = "datasource")
// 开启属性绑定,并设置bean,如果类里面也使用了`@Component`注解设置bean那么就要去掉,否则会报2个bean的错误
@EnableConfigurationProperties(ServerConfig.class)
Exception in thread “main” org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘com.zcl.config.ServerConfig’ available: expected single matching bean but found 2: serverConfig,servers-com.zcl.config.ServerConfig
关于springboot注解报错提示的解决方式
导入依赖坐标
<!--设置注解坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
宽松绑定
@ConfigurationProperties(prefix = “datasource”)绑定的属性名支持属性名宽松绑定
入下属性
// @Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private Integer port;
private String ipAddress;
private long timeout;
}
在配置文件中如下的写法都可以获取到值绑定到ipAddress
属性上
支持如下格式:
- 驼峰模式
- 下划线模式
- 中划线模式
- 常量模式
servers:
port: 8080
// ipAddress: 198.168.0.1 # 驼峰
// ipaddress: 198.168.0.1
// ip_address: 198.168.0.1 # unline
// ip-address: 198.168.0.1 # 烤肉串模式
// IP_ADDRESS: 198.168.0.1 # 常量
ip_A-d_dr_ess: 198.168.0.1
timeout: -1
注意:
宽松绑定不支持注解@Value
引用单个属性的方式
@ConfigurationProperties(prefix = “datasource”)绑定前缀命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符
2、常用计量单位应用
JDK8支持的时间与空间计量单位
配置文件设置如下:
servers:
port: 8080
ip-address: 198.168.0.1
timeout: -1
serverTimeOut: 3
dataSize: 1024
上面设置了一个时间单位和存储大小,二如果不指定的话我们就不知道指定的单位是上面,会造成很大的困惑,所以需要如下设置进行指定
// @Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private Integer port;
private String ipAddress;
private long timeout;
// 默认是毫秒,指定为消失
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut; // serverTimeOut=PT3H
// 默认的b字节大小,修改
@DataSizeUnit(DataUnit.KILOBYTES)
private DataSize dataSize; // dataSize=1048576B
}
Bean属性校验
导入校验框架
<!--导入JSR303校验规范,接口-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!-- 使用hibernate框架提供的校验器做实现类 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
在属性实体类上面开启Bean校验功能
/**
* 项目名称:SpringBootProject
* 描述:属性类
*
* @author zhong
* @date 2022-05-26 6:35
*/
// @Component
@Data
@ConfigurationProperties(prefix = "servers")
// 设置校验规则
@Validated
public class ServerConfig {
@Max(value = 8888,message = "设置的最大值不可超过8888")
@Min(value = 10,message = "最小值不能低于10")
private Integer port;
private String ipAddress;
private long timeout;
// 默认是毫秒,指定为消失
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut; // serverTimeOut=PT3H
// 默认的b字节大小,修改
@DataSizeUnit(DataUnit.KILOBYTES)
private DataSize dataSize; // dataSize=1048576B
}
在配置文件中修改最大值
servers:
port: 9999
当出现超出最大值的时候,会出现如下的错误消息
Property: servers.port Value: 9999 Origin: class path resource [application.yml] - 2:9 Reason: 设置的最大值不可超过8888
进制数据转换规则
如果是传递字符串类型的,要使用“ ”包裹,否则可能会出现进制转换