⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/weixin_52986315/article/details/126810407 「Binaire-沐辰」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

@ConfigurationProperties

源码分析

@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,通过如下源码可以看出, 如果你想绑定和验证一些外部属性,可以将它添加到类定义或@Configuration类中的@Bean方法上。

标注在类上

@Data   //使用该注解需要导入Lombok依赖
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {

private String userId;
private String name;
}

application.yml文件配置内容

userInfo:
userId: 1001
name: lucy

接下来通过控制器方法来返回这个对象,查看数据是否绑定

@RestController
public class HelloController {

@Autowired
private UserInfo userInfo;

@GetMapping("/user")
public UserInfo getUserInfo(){
return userInfo;
}
}

标注在方法上

上面源码中说到可以将它添加到@Configuration类中的@Bean方法上,所以下面来看看标注在方法上是如何使用的!

比如我们用到druid数据源的操作,这个数据源是属于第三方的,所以我们不能操作源码,不能再源码里面找到它的对象来给他添加注解,但我们可以在yml文件中给他配置,来拿到它的属性。

首先添加所需的依赖

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

接着在yml文件中配置数据源

spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username: root
password: root

创建一个配置类,然后在类方法上添加注解,并通过prefix绑定数据

@SpringBootConfiguration
public class DatasourceConfig {

@Bean
@ConfigurationProperties(prefix = "spring.database.druid")
public DataSource database(){
return new DruidDataSource();
}
}

通过控制器方法来检验绑定效果

@RestController
public class HelloController {

@Autowired
private DataSource dataSource;

@GetMapping("/datasource")
public void getDataSource(){
System.out.println(dataSource);
}

}

访问http://localhost/datasource,查看控制台输出!!!

松散绑定

我们在使用 @ConfigurationProperties注解的时候,@ConfigurationProperties(prefix = “userinfo”),这里给prefix的属性值与yml文件中的属性名称不一致,但是依旧绑定成功了!原因是什么呢?

这就需要提到Spring的松散绑定属性规则。因此使用以下方式书写都能与类的属性名称匹配。

userInfo:
userId: 1001 # 驼峰命名方式
#user_id: 1002 #下划线方式
#user-id: 1003 #烤肉串方式
#USER_ID: 1004 # 常量方式
name: lucycd

需要注意的是,prefix的属性值必须全部为小写,就像下图所示,就会报错:前缀必须是规范形式。

运行程序,也会在控制台提示你:配置属性名称“userInfo”无效;无效字符:“I”

数据校验

Spring Boot中有很多配置文件,配置文件中我们可以自定义一些对应的属性值。那么这些属性值是否合法呢?我们如何来校验?在Java中有一种JSR303规范,我们可以针对一些对应的数值来进行校验。按照规范来进行书写,如果不符合要求就说明校验失败,反之,则成功!

SpringBoot也给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVA EE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。

导入验证包和校验实现包

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

添加注解@Validated

给属性添加验证规则

@Data
@Component
@ConfigurationProperties(prefix = "userinfo")
@Validated
public class UserInfo {

@Max(value = 1000,message = "userid超出范围了!")
@Min(value = 0,message = "userid不能小于0!")
private String userId;

@Size(min = 2,max = 5,message = "name长度应该在2-5之间")
private String name;
}

这里我们先输入不符合规范的数据,来验证数据是否能够校验成功

userInfo:
userId: 1001
name: lucycd

编写一个控制器方法来检验

@RestController
public class HelloController {

@Autowired
private UserInfo userInfo;

@GetMapping("/user")
public UserInfo getUserInfo(){
return userInfo;
}

}

运行程序,查看控制台,校验成功!!!

同样,将数据修改为符合规则的数据,程序就可以成功运行了!!!

当然,这里的校验规则还有许多,@NotNull@NotEmpty@Email等等,可以根据实际情况选择合适的注解。

文章目录
  1. 1. @ConfigurationProperties
    1. 1.1. 源码分析
    2. 1.2. 标注在类上
    3. 1.3. 标注在方法上
  2. 2. 松散绑定
  3. 3. 数据校验