SpringBoot【实用篇】- 配置高级

文章目录

    • 目标:
      • 1.@ConfigurationProperties
      • 2.宽松绑定/松散绑定
      • 3. 常用计量单位绑定
      • 4.数据校验

目标:

  • @ConfigurationProperties
  • 宽松绑定/松散绑定
  • 常用计量单位绑定
  • 数据校验

在这里插入图片描述

1.@ConfigurationProperties

@ConfigurationProperties 在学习yml的时候我们了解到它是可以给对象进行属性注入的,有那么几个前提,yml中有配置,项目中有对应的实体类,用于封装数据且属性名一一对应
我在我的com.example包下创建了一个config的包包中写了这样一个类:

import org.springframework.stereotype.Component;
import lombok.Data;@Component //因为这个类要被Spring管理,所以加上注解@Component
@Data
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}

yml中

servers:ipAddress: 192.168.200.140port: 2345timeout: -1

我们想为上面的类赋上我们的配置文件的值就需要加上@ConfigurationProperties(prefix = "servers")

@Component //因为这个类要被Spring管理,所以加上注解@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}

验证: 这里选择在引导类中进行测试

import com.example.config.ServletConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class ConfigurationLearnApplication {public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象}}

在这里插入图片描述
但是又有一个问题:这个bean是我们自定义的bean,这个bean如果不是自定义的呢?如果是第三方的bean呢?如果这是一个数据源的bean,需要使用第三方bean加载的时候,该怎么做呢?这就是我们接下来要解决的。

假如我们这里引入一个第三方bean:

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.21</version></dependency>

然后我们去定义这个第三方bean,可以再创建一个配置类,但是这里我们就直接使用我们的引导类做演示即可

@SpringBootApplication
public class ConfigurationLearnApplication {@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();return dataSource;}public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象DruidDataSource ds = ctx.getBean(DruidDataSource.class);//拿到第三方bean对象System.out.println(ds);//打印第三方bean对象}
}

在这里插入图片描述
显示的是这个数据源初始化好以后的值,但是只有在druid连接到数据库的时候才会真正的初始化,这个属于是懒加载。
我们手动设置一下

 @Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}

在main方法中打印即可验证

 System.out.println(ds.getDriverClassName());

在这里插入图片描述
你写什么都可以,因为这里还不是真正的连接.这里是我们自己设置的,我们也可以注入进来通过yml,注入到第三方对象上

datasource: driverClassName: com.mysql.jdbc.Driver456

然后我们到引导类中修改一下:

@SpringBootApplication
public class ConfigurationLearnApplication {@Bean@ConfigurationProperties(prefix="datasource")public DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();
//        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}public static void main(String[] args) {//拿到容器对象ConfigurableApplicationContext ctx = SpringApplication.run(ConfigurationLearnApplication.class, args);ServletConfig bean = ctx.getBean(ServletConfig.class);//拿到这个对象System.out.println(bean);//打印这个对象DruidDataSource ds = ctx.getBean(DruidDataSource.class);//拿到第三方bean对象System.out.println(ds);//打印第三方bean对象System.out.println(ds.getDriverClassName());}
}

在这里插入图片描述
@EnableConfigurationProperties@ConfigurationProperties 有什么关系吗?
我们会在SpringBoot中看到大量前面有Enable的东西,我们可以理解为1一种开关,启用那些配置类
在引导类上我们加上这行代码:

@EnableConfigurationProperties(ServletConfig.class) // 启用配置类 如果有多个可以用 {} 包裹起来

结果运行之后发现报错啦!

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.config.ServletConfig' available: expected single matching bean but found 2: servletConfig,servers-com.example.config.ServletConfig

matching bean but found 2: 为什么会有两个bean? 在我们前面使用SevletConfig这个类的时候我们使用了@Component注解,我们把它注释掉,然后@EnableConfigurationProperties 是在告诉spring容器,我们现在有一组信息要去加载配置,如果这个东西它不被spring容器管理那它如何加载这些配置呢?
因此,这里自动把Servlet.class注入到了Spring容器中.

在这里插入图片描述
在这里插入图片描述
小结:@ConfigurationPropperties 可以为第三方1bean绑定属性

2.宽松绑定/松散绑定

但是如果我们先在配置文件yml中将datasource改成了dataSource
然后再在@ConfigurationProperties(prefix = “dataSource”)(改完后) ,
会发现报错了绑定不上
在这里插入图片描述
@ConfigurationProperties对于名称上的绑定其实是非常灵活的,Spring为了满足各种开发者的习惯,它提供了多种名称规范.

servers:ipAddress: 192.168.200.140port: 2345timeout: -1

配置类:

@Data
@ConfigurationProperties(prefix = "servers")
public class ServletConfig {private String ipAddress;private int port;private long timeout;
}

ipAddress一一对应是能用的.
但其实配置文件中的ipAdress其实是可以改动的.比如:ipaddress,ip_address,ip-address,IPADDRESS,IP_ADDRESS,IP_ADD_R_E_SS,IP_ADD_R_S-S这些都可以,但是主流格式是:ip-address 它有个有趣的名字叫烤肉串模式
在这里插入图片描述
在这里插入图片描述

注:宽松绑定不支持注解@Value引用单个属性的方式

在这里插入图片描述
在这里插入图片描述
小结:

  1. @ConfigurationProperties绑定属性支持属性名宽松绑定
  2. @Value注解不支持松散绑定
  3. 绑定前缀命名命名规则

3. 常用计量单位绑定

假如我们在yml中有这样的配置:

server:timeout: 30000000000

这样不太直观,到底多少位,而且单位是什么?
我们下面来解决这个问题:
JDK8一系列与单位有关的数据类型,其中有一个专门来描述数据范围的Duration
我们在yml 中加入这样一项: serverTimeOut: 3
然后到配置类中: private Duration serverTimeOut;
这里3 代表什么呢? => 3毫秒
我们可以定义单位:

 @DurationUnit(ChronoUnit.SECONDS)private Duration serveTimeout;

也可以配置存储容量 dataSize

   @DataSizeUnit(DataUnit.MEGABYTES)//private DataSize dataSize;

yml:

dataSize: 1024

在这里插入图片描述
但是也太难阅读啦~
如果你把dataSize: 10MB
然后把@DataSizeUnit去掉
在这里插入图片描述
10485760 / 1024 =10240
10240 / 1024 = 10
这样看起来更直观
在这里插入图片描述
在这里插入图片描述

4.数据校验

如果我们在配置文件中配置的时候本来想配置端口123的一不小心写成了a,那这样就会报错
在这里插入图片描述
那我们就需要做格式校验validation
数据校验

  • 开启数据校验有助于系统1安全性,J233规范中JSR303规范定义了一组有关数据校验相关的API

我们只需要使用这个API即可,引入这个坐标
在这里插入图片描述

		<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency>

那这套东西相当于什么呢?
我们用java链接数据库用到了JDBC技术,那问题来了,JDBC是一个接口还是实现类呢?是一个接口。我们用的是Mysql的驱动,这个是实现类,JDBC是一个规范,而mysql驱动是一个数据库的实现类,这里如此。validation是一组接口,还需要导入对应的实现依赖

	@Max(value = 8888, message = "端口号不能超过8888")@Min(value = 80, message = "端口号不能小于80")private int port;

但是很遗憾报错了,因为接口给我们了,我们没有实现它。就像Servelt是Tomcat实现的,JDBC 是mysql驱动实现的,现在要用校验框架,那实现却没有,因此报错。
在这里插入图片描述
上面图中有一个such as Hibernate Valiator 这个Hibernate校验器是个什么东西?
在这里插入图片描述

		<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>

这里我们就是使用hibernate框架提供的校验器做实现类,这样运行后就可以正常运行了。如果我们的配置不符合规定会报错误。在这里插入图片描述
在这里插入图片描述
除此之外,hibernate也给我们提供了一些东西

在这里插入图片描述
在这里插入图片描述
这里提供的方法更多
总结
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本章最后一节我们讲一个问题:配置一个数据库的信息,但是一直连不上,报的错误是密码错误,但是用navicat却能够正常连接,这个问题不是数据库的问题,而是springboot的问题,下面我们来模拟这个问题:

datasource:driverClassName: com.mysql.jdbc.Driver7122password: 0127

测试类:

@SpringBootTest
class ConfigurationLearnApplicationTests {@Value("${servers.ipAddress}")private String msg;@Value("${datasource.password}")private String password;@Testvoid contextLoads() {System.out.println(msg);System.out.println(password);}}

在这里插入图片描述
忽略上面那个,忘记注释了。哈哈哈哈
为什么是87呢?如果修改一下配置文件

datasource:driverClassName: com.mysql.jdbc.Driver7122password: "0127"

在这里插入图片描述
那为什么?
在这里插入图片描述
八进制的格式:0(0-7)
十六进制0x(0-9,a-f)
所以懂了叭~这是格式转换问题 !

小结

注意yml文件中对于数字的定义支持进制书写格式,如需要使用字符串请使用引号明确标注

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

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

相关文章

QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员&#xff0c;希望了解2D、3D相机视觉相关操作…

数字ic/FPGA,Windows/Linux系统,其他相关领域,软件安装包(matlab、vivado、modelsim。。。)

目录 一、总述 二、软件列表 1、modelsim_10.6c 2、notepad 3、matlab 4、Visio-Pro-2016 5、Vivado2018 6、VMware15 7、EndNote X9.3.1 8、Quartus 9、pycharm 10、CentOS7-64bit 一、总述 过往发了很多数字ic设计领域相关的内容&#xff0c;反响也很好。 最近…

【5.5】指针算法-三指针解决颜色分类

一、题目 给定一个包含红色、白色和蓝色&#xff0c;一共n个元素的数组&#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 此题中&#xff0c;我们使用整数0、1和2分别表示红色、白色和蓝色。 示例 1&#xff1…

刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:

控制文件是Oracle 数据库用来查找数据库文件&#xff0c;控制文件包含以下哪些信息&#xff1a; A 表空间信息 B 创建数据库的时间戳 C 有关数据文件、 联机重做日志文件、和归档重做日志文件的信息 D 数据库名称和数据库唯一标识符&#xff08;DBID) E RMAN备份…

3. 探索 Netty 的粘包与拆包解决方案

序言 在网络编程中&#xff0c;粘包和拆包现象常常是开发者在数据传输时遇到的棘手问题。如果消息在传输过程中没有正确的分包和组合&#xff0c;接收方可能会收到一组拼接在一起的数据&#xff08;粘包&#xff09;&#xff0c;或者一条消息被拆分成了不完整的部分&#xff0…

由浅入深逐步理解spring boot中如何实现websocket

实现websocket的方式 1.springboot中有两种方式实现websocket&#xff0c;一种是基于原生的基于注解的websocket&#xff0c;另一种是基于spring封装后的WebSocketHandler 基于原生注解实现websocket 1&#xff09;先引入websocket的starter坐标 <dependency><grou…

电信诈骗升级到了 FaceTime

最近&#xff0c;网上有消息称一些不法分子正在通过FaceTime来冒充微信、京东等平台的客服&#xff0c;骗取用户转移账号内的资金&#xff0c;或是申请贷款。 虽然从具体的诈骗方式来说还是老一套&#xff0c;但是却更加防不胜防&#xff0c;而且欺诈性更强&#xff0c;特别是…

‌5G SSB(同步信号块)位于物理层‌

‌5G SSB&#xff08;同步信号块&#xff09;位于物理层‌。在5G NR中&#xff0c;SSB由主同步信号&#xff08;PSS&#xff09;、辅同步信号&#xff08;SSS&#xff09;和物理广播信道&#xff08;PBCH&#xff09;组成&#xff0c;这些信号共同构成了SSB。SSB的主要功能是帮…

基于MATLAB驾驶行为的疲劳实时检测研究

[摘要]为了有效地检测出驾驶员的驾驶疲劳&#xff0c;本文设计了一种基于驾驶行为的实时疲劳驾驶检测模型。该算法选取与疲劳相关的驾驶行为指标&#xff0c;包括速度均值与标准差&#xff0c;加速度绝对均值与标准差&#xff0c;综合考虑报警设备的报警频率与驾驶时长来划分疲…

演练纪实丨 同创永益圆满完成10月份灾备切换演练支持

2024年10月&#xff0c;同创永益共支持5家客户圆满完成灾备切换演练&#xff0c;共涉及70多套核心系统总切换与回切步骤6000余个&#xff0c;成功率100%&#xff0c;RTO时长均达到客户要求。 其中耗时最短的一次演练仅花费约3个小时&#xff0c;共涉及32套系统的灾备切换演练&a…

Logback 常用配置详解

1. 配置文件解析 Logback 是 Spring Boot 默认使用的日志框架&#xff0c;Logback 配置主要包含 8 大元素 1.1 configuration Logback 配置文件的根元素&#xff0c;它包含所有的配置信息 1.2 appender 定义一个 Appender&#xff0c;即日志输出的目的地&#xff0c;如控制…

【AI日记】24.11.01 LangChain、openai api和github copilot

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 工作1 内容&#xff1a;学习deeplearning.ai的免费课程地址&#xff1a;LangChain Chat with Your DataB站地址&#xff1a;https://www.bilibili.com/video/BV148411D7d2时间&#xff1a;2小时评估&am…

#渗透测试#SRC漏洞挖掘# 操作系统-Linux系统

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

利用ExcelJS封装一个excel表格的导出

ExcelJS 操作和写入Excel 文件。 直接上代码&#xff0c;js部分&#xff1a; exportFn.js import ExcelJS from exceljs; import { saveAs } from file-saver;export function exportExcleUtils(tHeader, filterVal, listData, fileName) {//设置工作簿属性const workbook ne…

Android App 技能在DuerOS的调试方法

温故知新&#xff0c;我们先回顾一下DuerOS的技能分类。根据不同的视角可以对DuerOS 目前支持的技能类型进行不同的分类&#xff0c;例如&#xff0c;从用户与技能的语音交互方式来看&#xff0c; 可以将技能分为这四种技能类型: L1技能&#xff1a;只支持语音的打开和关闭L2技…

Unity 2D寻路导航 NavMeshPlus解决方案

插件的github主页 h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding 这个插件是基于新版3D寻路导航制作的&#xff0c;所以你可能需要看一下这篇文章 新旧Navmash 寻路导航组件对比 附使用案例与实用教程链接-CSDN博客 这行代码agent.updateUpAxis false 一定要为代理单位…

客户端与微服务之间的桥梁---网关

当我们创建好了N多个微服务或者微服务的实例之后&#xff0c;每个服务暴露出不同的端口地址&#xff0c;一般对于客户端请求&#xff0c;只需要请求一个端口&#xff0c;要隔离客户端和微服务的直接关系&#xff0c;保证微服务的安全性和灵活性&#xff0c;避免敏感信息的泄露。…

@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出

今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出&#xff0c;debug时发现是这样&#xff1a; 导出效果 这里我把能查到的方法都汇总了&#xff0c;如果你也遇到这个异常&#xff0c;可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…

Flink系列之:学习理解通过状态快照实现容错

Flink系列之&#xff1a;学习理解通过状态快照实现容错 状态后端检查点存储状态快照状态快照如何工作&#xff1f;确保精确一次&#xff08;exactly once&#xff09;端到端精确一次 状态后端 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state…

大数据之文件服务器方案

大数据文件服务器方案 一&#xff0c;文件服务器常用框架 二&#xff0c;文件服务器常用框架的实现技术 文件服务器常用框架 文件服务器是一种专门用于存储、管理和共享文件的服务器&#xff0c;其常用框架的实现技术涉及多个方面&#xff0c;以下是一些主要的实现技术及其详…