• Spring Boot常用注解@ConfigurationProperties、松散绑定、数据校验


    在这里插入图片描述

    @ConfigurationProperties

    源码分析

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VImM2Y7B-1662905478732)(C:\Users\19737\AppData\Local\Temp\1662899240307.png)]

    标注在类上

    @Data   //使用该注解需要导入Lombok依赖
    @Component
    @ConfigurationProperties(prefix = "userinfo")
    public class UserInfo {
    
        private String userId;
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    application.yml文件配置内容

    userInfo:
      userId: 1001
      name: lucy
    
    • 1
    • 2
    • 3

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

    @RestController
    public class HelloController {
    
        @Autowired
        private UserInfo userInfo;
    
        @GetMapping("/user")
        public UserInfo getUserInfo(){
            return userInfo;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnRhfHjq-1662905478733)(C:\Users\19737\AppData\Local\Temp\1662901651671.png)]

    标注在方法上

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

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

    • 首先添加所需的依赖
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druid-spring-boot-starterartifactId>
        <version>1.2.11version>
    dependency>
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 接着在yml文件中配置数据源
    spring:
      datasource:
        druid:
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
          username: root
          password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 创建一个配置类,然后在类方法上添加注解,并通过prefix绑定数据
    @SpringBootConfiguration
    public class DatasourceConfig {
    
        @Bean
        @ConfigurationProperties(prefix = "spring.database.druid")
        public DataSource database(){
            return new DruidDataSource();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 通过控制器方法来检验绑定效果
    @RestController
    public class HelloController {
    
        @Autowired
        private DataSource dataSource;
    
        @GetMapping("/datasource")
        public void getDataSource(){
            System.out.println(dataSource);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUQj5pPc-1662905478733)(C:\Users\19737\AppData\Local\Temp\1662903883866.png)]

    松散绑定

    我们在使用 @ConfigurationProperties注解的时候,@ConfigurationProperties(prefix = “userinfo”),这里给prefix的属性值与yml文件中的属性名称不一致,但是依旧绑定成功了!原因是什么呢?这就需要提到Spring的松散绑定属性规则。因此使用以下方式书写都能与类的属性名称匹配。

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

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmhQY4nn-1662905478734)(C:\Users\19737\AppData\Local\Temp\1662904642859.png)]

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDU3htS4-1662905478734)(C:\Users\19737\AppData\Local\Temp\1662904786812.png)]

    数据校验

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

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

    • 导入验证包和校验实现包
    <dependency>
        <groupId>javax.validationgroupId>
        <artifactId>validation-apiartifactId>
    dependency>
    <dependency>
        <groupId>org.hibernate.validatorgroupId>
        <artifactId>hibernate-validatorartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 添加注解@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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 这里我们先输入不符合规范的数据,来验证数据是否能够校验成功
    userInfo:
      userId: 1001
      name: lucycd
    
    • 1
    • 2
    • 3
    • 编写一个控制器方法来检验
    @RestController
    public class HelloController {
    
        @Autowired
        private UserInfo userInfo;
    
        @GetMapping("/user")
        public UserInfo getUserInfo(){
            return userInfo;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 运行程序,查看控制台,校验成功!!!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxuleNQx-1662905478734)(C:\Users\19737\AppData\Local\Temp\1662883054907.png)]

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

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

    [存下来直接上传(img-QxVR7AfR-1662905478735)(C:\Users\19737\AppData\Local\Temp\1662905154773.png)]

  • 相关阅读:
    LeetCode0416.分割等和子集 Go语言AC笔记
    Html + Express 实现大文件分片上传、断点续传、秒传
    居民配电站远程监控方案
    SpringMVC <url-pattern/>解读
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    RTC-实时音视频通信技术介绍与应用
    44.ES
    【广州华锐互动】AR技术在配电系统运维中的应用
    Mysql 8.0 安装
    Unity学习笔记--使用 VisualStudio 反编译 dll 代码查看源码
  • 原文地址:https://blog.csdn.net/weixin_52986315/article/details/126810407