SpringBoot 配置进阶

news2024/12/26 20:42:09

一、@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.coloradmin.cn/o/1191579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu下Anaconda环境安装GPU的pytorch(docker镜像)

实验室需要给每个人分配docker的container环境&#xff0c;为了节省系统的空间&#xff0c;打算把anaconda和深度学习的开发环境配置好拉取镜像以省时间。 基础环境配置 apt更新了清华源 安装了基础环境 gcc vim Linux文本编辑库 openssh-server ssh远程连接库 net-tools 包含…

iEnglish马铁鹰:智能教育塑造未来学习新范式

随着云计算、大数据、物联网、人工智能和区块链等新一代智能技术在教育中的广泛应用&#xff0c;教育正日益迈向智能时代。智能化和智慧化将深刻改变未来教育形式和学习方式&#xff0c;为教育带来更多可能性和机遇。根据教育部统计数据&#xff0c;截至2022年底&#xff0c;中…

Spring Cloud 微服务入门篇

文章目录 什么是微服务架构 Microservice微服务的发展历史微服务的定义微小的服务微服务 微服务的发展历史1. 微服务架构的发展历史2. 微服务架构的先驱 微服务架构 Microservice 的优缺点1. 微服务 e Microservice 优点2. 微服务 Microservice 缺点微服务不是银弹&#xff1a;…

VS Code画思维导图:Graphviz Markdown Preview

文章目录 简介常见属性聚集子图节点结构 简介 Graphviz是一种思维导图格式&#xff0c;其文件后缀是.dot。VS code中既有专门针对.dot的插件&#xff0c;也有嵌入Markdown的Graphviz插件&#xff0c;从我个人的使用频次来说&#xff0c;后者更加常用&#xff0c;有了Graphviz …

【大模型-第一篇】在阿里云上部署ChatGLM3

前言 好久没写博客了&#xff0c;最近大模型盛行&#xff0c;尤其是ChatGLM3上线&#xff0c;所以想部署试验一下。 本篇只是第一篇&#xff0c;仅仅只是部署而已&#xff0c;没有FINETUNE、没有Langchain更没有外挂知识库&#xff0c;所以从申请资源——>开通虚机——>…

Postgres主键自增时重复键违反唯一约束

错误: 重复键违反唯一约束\"bue_new_copy1_pkey\"\n 详细&#xff1a;键值\"(id)(31)\"已经存在\n 新增的数据的id跟表里面的数据id重复了&#xff0c;这种一般是手动导入数据或者复制表等情况造成的&#xff0c;直接修改表的序列为当前最大的id&#xf…

MCSM面板搭建教程和我的世界Paper服务器开服教程

雨云游戏云VPS服务器用Linux搭建MCSM面板和Minecraft Paper1.20.2服务器教程。 本教程演示安装的MC服是Paper 1.20.2版&#xff0c;其他版本也可以参考本教程&#xff0c;差别不大。 本教程使用Docker来运行mc服&#xff0c;可以方便切换不同Java版本&#xff0c;方便安装多个…

【GEE】9、在GEE中生成采样数据【随机采样】

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何使用高分辨率图像生成存在和不存在数据集。如何在要素类图层中生成随机分布的点以用作字段采样位置。如何根据参数过滤您的点以磨练您的采样位置。 华盛顿州白杨林旁的落基山麋鹿。 图片来源&#xff1a;美国…

2023.11.7: OpenAI DevDay总结

New Model&#xff1a;ChatGPT4.0 turbo 更长的context&#xff1a;支持长达128000个tokens的context 更好的控制方案&#xff1a; 更有利于API调用JSON Mode Function calling Reproducible outputs 通过一个seed使得模型的回答总是保持一致 Better Knowledge 支持知识检索…

阿里云服务器ECS经济型e实例和u1有什么区别?

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共享型云服务器&#xff0c;通用算力型u实例是企业级独享型云服务器&#xff0c;e实例性价比高&#xff0c;现在2核2G3M带宽一年99元&#xff0c;云服务器u1价格相对要…

阿里云通用算力型u1服务器和e实例有什么区别?选择攻略

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共享型云服务器&#xff0c;通用算力型u实例是企业级独享型云服务器&#xff0c;e实例性价比高&#xff0c;现在2核2G3M带宽一年99元&#xff0c;云服务器u1价格相对要…

数据结构:AVL树的旋转(高度平衡树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&#xff0c;他们…

vue-cal 使用教程

目录 0. 介绍及效果展示 1.vue2环境安装 2.页面引入 3.使用 4.效果图 0. 介绍及效果展示 vue-cal 组件比较灵活&#xff0c;可以随意切换年、月、周、日、时间历图&#xff0c;放几张截图看下效果 1.vue2环境安装 vue3直接可以看本文最下方的API&#xff0c;有详解 npm …

Apache RocketMQ - 概述

2022年&#xff0c;RocketMQ 5.0的正式版发布&#xff0c;相比于4.0版本而言&#xff0c;架构走向云原生化&#xff0c;并且覆盖了更多的业务场景。 如何从互联网时代演进到云时代&#xff1f; 1. 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车&#xff0c;…

Python基础教程之十七:Python OrderedDict –有序字典

一个OrderedDict 维护插入顺序添加到字典中的项目。项目的顺序在迭代或序列化时也会保留。 1. Python OrderedDict示例 OrderedDict 是python collections模块的一部分。 要轻松构建OrderedDict&#xff0c;可以OrderedDict在collections模块中使用。 OrderedDictExample.p…

建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09; 1、类型2、定义3、UML图4、四个角色5、代码6、应用场景 1、类型 创建型 解释&#xff1a;设计模式的创建性类型是一种软件设计模式&#xff0c;它专注于对象的创建机制&#xff0c;帮助我们更加灵活地创建对象实例。创建性…

Python基础教程之十六:Python multidict示例–将单个键映射到字典中的多个值

1.什么是multidict词典> 在python中&#xff0c;“ multidict ”一词用于指代字典&#xff0c;在字典中可以将单个键映射到多个值。例如 多重结构 multidictWithList {key1 : [1, 2, 3],key2 : [4, 5]}multidictWithSet {key1 : {1, 2, 3},key2 : {4, 5}}1. list如果要…

“隐身术”成现实,中科院院士现场表演

&#xff08;图源&#xff1a;哔哩哔哩&#xff09; 在“bilibili超级科学晚”活动现场&#xff0c;中国科学院院士褚君浩为我们揭示了“隐身术”的原理。原来&#xff0c;这种神奇的技能是一种科学手段。 褚君浩院士为大家介绍了一种名为“柱镜光栅”的特殊材料&#xff0c;柱…

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令&#xff0c;总结在此&#xff0c;后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…

MYSQL函数,一篇文章看完!

做程序员的谁会离得开数据库呢&#xff1f;今天就来分享一下我整理的MySQL的常用函数&#xff0c;基本上囊括了平时要用的函数&#xff0c;它们已经陪我走过了不少年头了&#xff0c;风里来雨里去&#xff0c;缝缝补补又几年&#xff0c;希望能帮到你们&#xff01; 如果数据库…