SpringBoot实用篇二(高级配置)
1、@ConfigurationProperties(prefix = " ”)
创建ServerConfig
实体类
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {private Integer port;private String ipAddress;private long timeout;
}
获取属性【设置属性值】
servers:port: 8080ipAddress: 198.168.0.1timeout: -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.alibabagroupId><artifactId>druidartifactId><version>1.1.10version>
dependency>
-
配置文件设置
datasource:driverClassName: com.mysql.jdbc.Driver
-
引导类设置
&#64;SpringBootApplication
public class Springboot12ConfigurationApplication {&#64;Bean&#64;ConfigurationProperties(prefix &#61; "datasource")public DruidDataSource dataSource() {DruidDataSource dataSource &#61; new DruidDataSource();return dataSource;}public static void main(String[] args) {ConfigurableApplicationContext run &#61; SpringApplication.run(Springboot12ConfigurationApplication.class, args);ServerConfig bean &#61; run.getBean(ServerConfig.class);DruidDataSource druidbean &#61; run.getBean(DruidDataSource.class);System.out.println(druidbean.getDriverClassName()); System.out.println(bean);}
}
可以在对象里面自定义设置set
的值&#xff0c;也可以通过&#64;ConfigurationProperties(prefix &#61; "datasource")
注解绑定
比较
&#64;ConfigurationProperties(prefix &#61; "datasource")
&#64;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.bootgroupId><artifactId>spring-boot-configuration-processorartifactId>
dependency>
宽松绑定
&#64;ConfigurationProperties(prefix &#61; “datasource”)绑定的属性名支持属性名宽松绑定
入下属性
&#64;Data
&#64;ConfigurationProperties(prefix &#61; "servers")
public class ServerConfig {private Integer port;private String ipAddress;private long timeout;
}
在配置文件中如下的写法都可以获取到值绑定到ipAddress
属性上
支持如下格式&#xff1a;
- 驼峰模式
- 下划线模式
- 中划线模式
- 常量模式
servers:port: 8080// ipAddress: 198.168.0.1 // ipaddress: 198.168.0.1// ip_address: 198.168.0.1 // ip-address: 198.168.0.1 // IP_ADDRESS: 198.168.0.1 ip_A-d_dr_ess: 198.168.0.1timeout: -1
注意&#xff1a;
宽松绑定不支持注解&#64;Value
引用单个属性的方式
&#64;ConfigurationProperties(prefix &#61; “datasource”)绑定前缀命名规范&#xff1a;仅能使用纯小写字母、数字、下划线作为合法的字符
2、常用计量单位应用
JDK8支持的时间与空间计量单位
配置文件设置如下&#xff1a;
servers:port: 8080ip-address: 198.168.0.1timeout: -1serverTimeOut: 3dataSize: 1024
上面设置了一个时间单位和存储大小&#xff0c;二如果不指定的话我们就不知道指定的单位是上面&#xff0c;会造成很大的困惑&#xff0c;所以需要如下设置进行指定
&#64;Data
&#64;ConfigurationProperties(prefix &#61; "servers")
public class ServerConfig {private Integer port;private String ipAddress;private long timeout;&#64;DurationUnit(ChronoUnit.HOURS)private Duration serverTimeOut; &#64;DataSizeUnit(DataUnit.KILOBYTES)private DataSize dataSize;
}
Bean属性校验
导入校验框架
<dependency><groupId>javax.validationgroupId><artifactId>validation-apiartifactId>
dependency>
<dependency><groupId>org.hibernate.validatorgroupId><artifactId>hibernate-validatorartifactId>
dependency>
在属性实体类上面开启Bean校验功能
&#64;Data
&#64;ConfigurationProperties(prefix &#61; "servers")
&#64;Validated
public class ServerConfig {&#64;Max(value &#61; 8888,message &#61; "设置的最大值不可超过8888")&#64;Min(value &#61; 10,message &#61; "最小值不能低于10")private Integer port;private String ipAddress;private long timeout;&#64;DurationUnit(ChronoUnit.HOURS)private Duration serverTimeOut; &#64;DataSizeUnit(DataUnit.KILOBYTES)private DataSize dataSize;
}
在配置文件中修改最大值
servers:port: 9999
当出现超出最大值的时候&#xff0c;会出现如下的错误消息
Property: servers.port
Value: 9999
Origin: class path resource [application.yml] - 2:9
Reason: 设置的最大值不可超过8888
进制数据转换规则
如果是传递字符串类型的&#xff0c;要使用“ ”包裹&#xff0c;否则可能会出现进制转换