目录
@ConfigurationProperties
第三方bean属性绑定
自定义一个配置类Bean
package com.zqf.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;
private long timeout;
}
拿到容器并getBean:
package com.zqf;
import com.zqf.config.ServerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Springboot13ConfigurationApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
ServerConfig bean = ctx.getBean(ServerConfig.class);
System.out.println(bean);
}
}
可以看到bean正常加载
思考:这里是自定义的bean,如果是第三方bean呢?
不光自定义的bean可以注入数据,第三方bean也可以注入数据
举例:
引入druid
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
现在打算DriverClassName从外部注入进来,这个值从配置文件中来。
datasource: driverClassName: com.musql.jdbc.Driver12312312313
tip:
@EnableConfigurationProperties()这个注解可以清晰看到有哪些东西是从我们的配置中读取属性的,这样的管理没有那么松散。
@EnableConfigurationProperties和@ConfigurationProperties的区别
- 一个具体做属性绑定,另外一个呢是开启属性绑定,并设定对应的目标是谁。
宽松绑定/松散绑定
问题描述:
对于我们在使用@ConfigurationProperties这个注解的时候,他绑定属性对于名称上的要求其实是非常灵活的,此后的为了充分的接触各种各样的编程爱好者的书写习惯,springboot设定了若干种匹配格式。
- @ConfigurationProperties绑定属性支持属性名宽松绑定
注意:宽松绑定不支持注解@Value引用单个属性的方式
- 绑定前缀名(注解里的prfix属性值)命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符
- 规范的名称(类的属性名称)应该是烤肉串(kebabl)模式(case),即使用-分隔,使用小写字母数字作为标准字符,且必须以字母开头。
- 如果我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用
@Value
。- 如果我们专门编写了一个 JavaBean 来和配置文件进行映射,我们就直接使用
@ConfigurationProperties
。
常用计量单位绑定
配置文件:
SpringBoot支持JDK8提供的时间与空间计量单位
package com.zqf.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DataSizeUnit;
import org.springframework.boot.convert.DurationUnit;
import org.springframework.stereotype.Component;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
//自定义时间计量单位
@DurationUnit(ChronoUnit.MINUTES)
private Duration serverTimeOut;
//自定义空间计量单位
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize dataSize;
}
Druation和DataSize常用单位:
数据校验
开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API。
开启校验框架(validation校验框架由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>
bean属性校验
- 1.在需要开启校验功能的类上使用注解@Validated开启校验功能
- 2.具体的校验规则需要对具体的字段设置校验规则(还有更多接口)
结果:
启用Bean属性校验
●导 入JSR303与Hibernate校验框架坐标
●使用@Validated注解启 用校验功能
●使用具体校验规则规范数据校验格式
进制数据转换规则
问题描述:
解决方法:
原因:
它识别到了零开头的数据之后,并且是个纯数字,他默认将他按照数值进行解析,八进制转十进制,转完之后得到结果直接付给String password。
springboot建议如果是纯字符串的话,需要用双引号包裹。yaml文件中对于数字的定义支持进制书写格式,如需使用字符串请使用引号明确标注。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99456.html