SpringBoot 配置进阶

一、@ConfigurationProperties

1、 在类定义上

@ConfigurationProperties注解,此注解是用来为bean绑定属性。使用步骤如下:

  1. 在配置文件 application.yml 中,添加配置信息

    servers:
      ip-address: 127.0.0.1
      port: 8123
    
  2. 创建配置类,并在配置类上添加注解 @ConfigurationProperties,并配置 prefixprefix为配置文件中的前缀,即完成。

    package com.ty.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;
    }
    
    
  3. 最后,可以通过获取bean测试,配置信息已经注入。

    package com.ty;
    
    import com.ty.config.ServerConfig;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class SpringbootConfigApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args);
    
            ServerConfig bean = run.getBean(ServerConfig.class);
            System.out.println(bean);
        }
    
    }
    
    

2、 在方法定义上

@ConfigurationProperties 注解不仅能添加到类上,还可以添加到方法上,添加到类上是为spring容器管理的当前类的对象绑定属性,添加到方法上是为spring容器管理的当前方法的返回值对象绑定属性。案例如下:

  1. 在配置文件 application.yml 中,添加配置信息

    spring:
      datasource:
        password: 123
        username: root
    
  2. 创建配置类,并通过@Bean定义bean,在对应的类上直接使用 @ConfigurationProperties 进行属性绑定

    package com.ty.config;
    
    import com.ty.domain.TyDataSource;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class DataSourceConfig {
    
        @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public TyDataSource dataSource(){
            return new TyDataSource();
        }
    
    }
    
  3. 最后,可以通过获取bean测试,配置信息已经注入。

    package com.ty;
    
    import com.ty.config.ServerConfig;
    import com.ty.domain.TyDataSource;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class SpringbootConfigApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args);
    
            TyDataSource bean1 = run.getBean(TyDataSource.class);
            System.out.println(bean1);
        }
    
    }
    

3、 @EnableConfigurationProperties 注解

针对注解 @ConfigurationProperties ,既可以在类上,又可以在方法上,这样整体开发管理与定位可能会越发混乱。于是spring提供了一个新的注解 @EnableConfigurationProperties注解,专门标注使用@ConfigurationProperties注解绑定属性的bean是哪些。

package com.ty;

import com.ty.config.DataSourceConfig;
import com.ty.config.ServerConfig;
import com.ty.domain.TyDataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
@EnableConfigurationProperties({ServerConfig.class})
public class SpringbootConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringbootConfigApplication.class, args);

        ServerConfig bean = run.getBean(ServerConfig.class);
        System.out.println(bean);
    }

}

二、宽松、松散绑定

springboot进行编程时人性化设计的一种体现,即配置文件中的命名格式与变量名的命名格式可以进行格式上的最大化兼容。

  1. @ConfigurationProperties绑定属性时支持属性名宽松绑定,这个宽松体现在属性名的命名规则上
  2. @Value注解不支持松散绑定规则
  3. 绑定前缀名推荐采用烤肉串命名规则,即使用中划线做分隔符

以下都兼容:

servers:
  ipAddress: 192.168.0.2       # 驼峰模式
  ip_address: 192.168.0.2      # 下划线模式
  ip-address: 192.168.0.2      # 烤肉串模式
  IP_ADDRESS: 192.168.0.2      # 常量模式

三、计量单位绑定

springboot充分利用了JDK8中提供的全新的用来表示计量单位的新数据类型

  • Duration:表示时间间隔,可以通过 @DurationUnit 注解描述时间单位,例如上例中描述的单位为小时(ChronoUnit.HOURS)

  • DataSize:表示存储空间,可以通过 @DataSizeUnit 注解描述存储空间单位,例如上例中描述的单位为MB(DataUnit.MEGABYTES)

@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;
}

也可以使用 @Value注解,对于计量单位,可以使用关键字“MB”、“KB”等将属性值转换为对应的字节数。

具体来说,可以在Java Bean的属性上使用@Value注解,将 “xx:0” 格式的配置文件属性值解析为对应的数值,并在后面加上“{unit}”表示计量单位。例如:

@ConfigurationProperties(prefix = "server")
public class ServerProperties {
    @Value("${size-limit:50}${size-unit:MB}")
    private long sizeLimit;
}

四、数据校验

SpringBoot给出了强大的数据校验功能,可以有效的避免比如代码中需要int类型,配置中给了非法的数值的问题的发生。
在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架。

如使用Hibernate提供的校验框架来作为实现进行数据校验。Hibernate Validator 是一个基于 Bean Validation 规范的验证框架,提供了一系列的注解用于验证 Java Bean 的属性值。其常用的验证如下:

验证注解说明
@NotNull验证对象是否为空(null)
@NotEmpty验证对象是否为空,长度必须大于0
@NotBlank验证字符串不为空,长度必须大于0,字符串中的空格不算
@Size验证对象是否在指定的范围之内(包括字符串、集合、Map和数组等)
@Min验证数值是否大于等于指定值
@Max验证数值是否小于等于指定值
@DecimalMin验证 BigDecimal 和 BigInteger 是否大于等于指定值
@DecimalMax验证 BigDecimal 和 BigInteger 是否小于等于指定值
@Digits验证数值是否符合指定的数值格式(整数或小数)
@Past验证日期是否在当前时间之前
@Future验证日期是否在当前时间之后
@Pattern验证字符串是否符合指定的正则表达式

案例如下:

  1. 引入 jar javax.validationorg.hibernate.validator

    <!--1.导入JSR303规范-->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
    <!--使用hibernate框架提供的校验器做实现-->
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
    
  2. 在需要开启校验功能的类上使用注解@Validated开启校验功能,并对具体的字段设置校验规则

    package com.ty.config;
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.annotation.Validated;
    
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    
    @Data
    @Component
    @ConfigurationProperties(prefix = "user")
    @Validated
    public class UserConfig {
    
        @Max(value = 1000, message = "The max number can not exceed to 1000")
        private Integer number;
        @Min(value = 20, message = "The minimum age limit ")
        private Integer age;
    }
    
    
  3. 检验,在 application.yml 配置文件中配置不满足验证条件的数据时,报错提示如下:

    user:
      age: 18
      number: 10
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/122783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成&#xff0c;就差torch的安装了&#xff0c;现在torch我要装的是1.2.0版本的&#xff0c;安装包以及下载好了&#xff0c;安装包都是在这个网站里下载的&#xff08;点此进入&…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址&#xff1a; chrome版本118&#xff1a; https://download.csdn.net/download/qq_35845339/88510476 chrome版本119&#xff1a; chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…

【Linux C IO多路复用】多用户聊天系统

目录 Server-Client mutiplexingServer mutiplexingClient mutiplexing Server-Client 在Linux系统中&#xff0c;IO多路复用是一种机制&#xff0c;它允许一个进程能够监视多个文件描述符&#xff08;sockets、pipes等&#xff09;的可读、可写和异常等事件。这样&#xf…

洋子带你赚钱,粉丝有奖任务来啦,最高拿90京东卡

大家好&#xff0c;我是洋子&#xff0c;前段时间CSDN联合阿里云发布了免费试用3种 云服务器的活动任务&#xff0c;每完成一个任务就可以拿到30京东卡&#xff0c;3个任务互相独立&#xff0c;如果3个任务全部完成就可以拿到90京东卡 任务奖励 参与体验大概十几分钟&#xf…

类直径树上贪心

http://cplusoj.com/d/senior/p/SS231109C 场上想到枚举点&#xff0c;然后最大值为高&#xff0c;然后可以求最大值。但是感觉计数会重 计数其实不会重&#xff0c;如图中&#xff0c;红色线段显然比蓝色线段优 所以我们枚举3叉点时没错的 #include<bits/stdc.h> usin…

『亚马逊云科技产品测评』活动征文|AWS 云服务器实例类型及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 定价计算器 &#xff08;1&#xff09;定价计算器官网 &…

深度学习_10_softmax_实战

由于网上代码的画图功能是基于jupyter记事本&#xff0c;而我用的是pycham,这导致画图代码不兼容pycharm,所以删去部分代码&#xff0c;以便能更好的在pycharm上运行 完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合"…

使用合成数据训练语义分割模型

计算机视觉应用现在在各个科技领域无处不在。 这些模型高效且有效&#xff0c;研究人员每年都会尝试新想法。 新的前沿是试图消除深度学习的最大负担&#xff1a;需要大量的标记数据。 正如本文所述&#xff0c;此问题的解决方案是使用合成数据。 从这些研究中获益最多的计算机…

ros1 模拟客户端生成小乌龟服务请求生成小乌龟

模拟客户端生成小乌龟服务请求生成小乌龟 一、话题模型二、创建功能包三 创建客户端Client代码四 配置CMakeLists.txt编译规则&#xff1a;五 测试启动ros 主服务启动小乌龟的服务启动模型客户端服务 一、话题模型 Sever端是海龟仿真器/turtlesim&#xff0c;Client端是待实现…

Android 13.0 Launcher3 app图标长按去掉应用信息按钮

1.前言 在13.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…

BigDecimal使用的时候需要注意什么?

BigDecimal只要涉及到浮点数运算都会用到BigDecimal&#xff0c;并且面试的时候经常会问到&#xff0c;那么BigDecimal使用的时候需要注意什么&#xff1f; 目录 1.为什么不能用浮点数表示金额&#xff1f;2.十进制转换二进制3.科学记数法4.IEEE 7545.在线浮点数转换二进制6.原…

限流式保护器在养老院火灾预防中的应用

安科瑞 华楠 【摘要】老年人是一个庞大特殊的社会群体。随着我国人口的老龄化&#xff0c;老年人口数量断上升。涉及老年人的火灾越来越多&#xff0c;本文从养老院火灾的案例、成因、预防措施等方面对此类火灾进行了深入的探讨。 【关键词】老年公寓&#xff1b;火灾预防&…

VINS-Mono-后端优化 (一:预积分残差计算-IMU预积分约束)

这里先回顾一下预积分是怎么来的 VINS-Mono-IMU预积分 &#xff08;三&#xff1a;为什么要预积分预积分推导&#xff09; 这里贴出预积分的公式 具体含义解释看对对应的文章 整个误差函数如下 预积分 α \alpha α β \beta β γ \gamma γ 是用 IMU 预积分获得的增量&a…

CSS关于默认宽度

所谓的默认宽度&#xff0c;就是不设置width属性时&#xff0c;元素所呈现出来的宽度 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}.box {/…

Hive 常用存储、压缩格式

1. Hive常用的存储格式 TEXTFI textfile为默认存储格式 存储方式&#xff1a;行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive 无法进行合拆分 SEQUENCEFILE sequencefile二进制文件&#xff0c;以<key,value>的形式序列到文件中 存储方式&#xff1a;行存储 可…

STM32中断简介

中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行&#xff1b; 以上是中断的…

Docker - 镜像

Docker - 镜像 镜像是什么 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包括代码&#xff0c;运行时&#xff0c;库&#xff0c;环境变量和配置文件。…

电脑风扇控制软件 Macs Fan Control Pro mac中文版功能介绍

Macs Fan Control mac是一款专门为 Mac 用户设计的软件&#xff0c;它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度&#xff0c;以提高设备的散热效果&#xff0c;减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…

如何在Python爬虫中使用IP代理以避免反爬虫机制

目录 前言 一、IP代理的使用 1. 什么是IP代理&#xff1f; 2. 如何获取IP代理&#xff1f; 3. 如何使用IP代理&#xff1f; 4. 如何避免IP代理失效&#xff1f; 5. 代理IP的匿名性 二、代码示例 总结 前言 在进行爬虫时&#xff0c;我们很容易会遇到反爬虫机制。网站…
最新文章