[Spring] Spring配置文件

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 配置文件快速上手
  • 2. 配置文件的格式
  • 3. properties配置文件的说明
    • 3.1 properties基本语法
    • 3.2 读取配置文件
    • 3.3 properties的缺点
  • 4.yml配置文件说明
    • 4.1 yml基本语法
    • 4.2 yml使用进阶
      • 4.2.1 yml配置不同的数据类型及其null
      • 4.2.2 yml配置读取
      • 4.2.3 注意事项:value值佳单引号和双引号
      • 4.2.4 配置对象
      • 4.2.5 配置集合
      • 4.2.6 配置map
  • 5. 综合性练习:验证码案例
    • 5.1 接口文档
    • 5.2 Hutool工具介绍
    • 5.3 后端代码
    • 5.4 前端代码

1. 配置文件快速上手

我们在前面讲解Tomcat的时候,默认的端口号是8080,如果我们有的程序访问的端口号也是8080的时候,这时候就会发生端口号冲突,所以我们需要通过配置文件来修改程序运行时的端口号.在项目创建的时候,就帮我们自动创建了一个配置文件.他的后缀是.properties.
在这里插入图片描述
我们点开配置文件修改程序的端口号:

spring.application.name=demo
server.port=9090

运行程序:我们可以发现程序的端口号变成了9090.
在这里插入图片描述
这时候我们通过8080端口号访问其中的html页面的时候,就无法访问了.
在这里插入图片描述

2. 配置文件的格式

SpringBoot的配置文件有以下三种:
• application.properties
• application.yml
• application.yaml
其中yml格式和yaml格式其实是等同的.yml是yaml的缩写.
需要注意的一点是,配置文件的文件名只能是以上三个,文件名一旦修改,配置文件就会变成无效配置文件.

  • 特殊说明:
    1. 如果properties和yml存在于同一个项目的时候,两个配置都会加载,但是如果配置文件内容有冲突的时候,.properties文件的优先级更高.
    2. 虽然他们可以共存,但是我们在实际的也业务当中,我们一般只使用一个文件来配置,这样可以更好的维护.

3. properties配置文件的说明

properties配置文件是最早期的配置文件格式,也是创建SpringBoot项目默认的配置文件

3.1 properties基本语法

properties是以键值的形式配置的,单词和单词之间用.分割,就像导包一样.key和value之间是以=连接的.比如:

spring.application.name=demo
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.name=root
spring.datasource.password=qwe123524

[提示] 配置文件中可以通过在前面加#来注释信息.

3.2 读取配置文件

如果在项目中,想要读取配置文件中的内容,可以使用@Value注解来实现.@Value注解在后面的参数中使用${}的格式来读取,代码如下:

@RestController
@RequestMapping("/demo")
public class PropertiesController {@Value("${mykey.key}")private String key;@RequestMapping("/key")public String key(){return key;}
}

运行结果:
在这里插入图片描述

3.3 properties的缺点

properties配置文件是以key-Value的形式来配置的,但是有的时候,配置文件中的信息有些赘余,比如下面的配置,spring.datasource这个内容就是赘余的:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
spring.datasource.name=root
spring.datasource.password=qwe123524

要想解决这个问题,我们需要引入yml配置文件的格式了.

4.yml配置文件说明

4.1 yml基本语法

yml是树形结构的配置文件,他的基础语法是:key: value,需要注意的一点是,key和value之间的空格不可以省略.
基础语法如下:
在这里插入图片描述
我们看到,要是yml的键值对中间没有空格的话,key是没有语法高亮的,语法就是错误的.
下面我们就把上面连接数据库的案例改写为yml的格式.

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=falsename: rootpassword: qwe123524

我们看到,前面我们所说的"赘余"的信息,在yml下可以合并到一起写了.这里行与行之间的缩进一般是两个空格.

4.2 yml使用进阶

4.2.1 yml配置不同的数据类型及其null

# 字符串 
string.value: Hello
# 布尔值,true或false 
boolean.value: true
boolean.value1: false
# 整数 
int.value: 10
# 浮点数 
float.value: 3.14159
# Null,~代表null 
null.value: ~
# "" 空字符串 
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来 
empty.value: ''

这里需要注意的地方只有两点,第一就是空字符串是一个单引号,第二就是null用一个波浪号来表示.

4.2.2 yml配置读取

yml读取配置的方法和properties相同,使用@Value注解即可,实现代码如下:

string:hello: bite
@RequestMapping("/demo")
@RestController
public class YmlController {@Value("${string.hello}")public String hello;@RequestMapping("/hello99")public String hello(){return this.hello;}
}

运行结果:
在这里插入图片描述

4.2.3 注意事项:value值佳单引号和双引号

字符串默认不用加上单引号或者是双引号,如果加了的话,有的情况下又会表示特殊含义.
比如在yml文件中配置如下信息:

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
@RestController
public class ReadYml {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic String readYml(){System.out.println(str1);System.out.println(str2);System.out.println(str3);return "yml";}
}

在这里插入图片描述
在这里我们可以看到:

  1. 字符串默认不用加上单引号或者双引号
  2. 加了单引号之后,特殊字符会被转义,只表示的是一个普通的字符串,加了双引号之后,特殊字符不会被转义.

注意:这里的转义说起来可能会有些拗口,\n本来表示的是换行,使用单引号发生了转义,也就是说,\n不再表示换行了,表示的是一个普通的字符串,而加了双引号之后就表示的是特殊字符的本意,没有发生转义.

我们来说明一下@PostConstruct这个注解,这个注解表示的是,在服务启动之后,这个方法会变为初始化方法,这个方法在后端立即就会执行,如果有打印信息的话,会立即打印在后端的控制台上.相比于使用@RequestMapping注解,我们就不需要通过浏览器来访问最终结果了,我们只需要在后端的控制台上看最终的结果即可.

4.2.4 配置对象

我们还可以在yml中配置对象.如下配置:

student:id: 1name: javaage: 20

这个时候我们就不可以用@Value来配置对象了,此时就要使用到另一个注解:@ConfigurationProperties来读取.具体实现如下:

@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {public Integer id;public String name;public Integer age;
}
@RestController
public class StudentController {@Autowiredprivate Student student;@PostConstructpublic void readStudent(){System.out.println(student);}
}

运行结果:
在这里插入图片描述
[注意事项]

  1. 在一个类中给对象中的属性赋值的时候,这个类必须有Set方法,所以我们才要在类的头上加上@Data注解,我们下面不引入注解,手动写入Set方法,来验证这种说法的可靠性.
@Component
@ConfigurationProperties(prefix = "student")
public class Student {public Integer id;public String name;public Integer age;public void setId(Integer id) {this.id = id;}public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

运行结果:
在这里插入图片描述
2. 在类的属性中,属性名必须和yml中的字段名是一致的.否则无法对应的上.

4.2.5 配置集合

配置文件还可以配置List集合,(包括数组,Set在内都是如下的方法)如下所示:

dbtypes:name:- mysql- sqlserver- db2

就是在每一个字符串的前面加上一个横杠,就表示的是列表,和md的语法非常相似.

import java.util.List;
@Component
@Data
@ConfigurationProperties(prefix = "dbtypes")
public class ListConfig {public List<String> name;//对应name字段
}
@RestController
public class ReadYml2 {@Autowiredpublic ListConfig listConfig;@PostConstructpublic void readList(){System.out.println(listConfig);}
}

运行结果:
在这里插入图片描述
在配置集合的时候,上述代码实际上也是在配置一个对象,所以仍然使用@ConfigurationProperties注解.

4.2.6 配置map

配置文件也可以配置map,如下所示:

maptypes:map:k1: v1k2: v2k3: v3
@Component
@Data
@ConfigurationProperties(prefix = "maptypes")
public class MapConfig {//注意字段名的一致性public Map<String,String> map;
}
@RestController
public class ReadYml3 {@Autowiredpublic MapConfig mapConfig;@PostConstructpublic void mapReader(){System.out.println(this.mapConfig);}
}

运行结果:
在这里插入图片描述

5. 综合性练习:验证码案例

5.1 接口文档

  • 需求分析
    1. 生成验证码,并返回验证码
    2. 校验验证码是否正确:校验验证码是否正确.
  • 生成验证码:
    • 请求
    请求url: /captcha/getCaptcha
    请求参数: 无
    
    • 响应
      验证码内容的图片.浏览器给服务器发送⼀个/captcha/getCaptcha 这样的请求,服务器返回⼀个图片,浏览器显显示在页面上.
  • 校验验证码是否正确
    • 请求
    请求url: /captcha/check
    请求参数: captcha=用户输入的验证码
    
    • 响应
      true or false,验证成功,返回true,验证失败,返回false.

5.2 Hutool工具介绍

验证码的图片该怎么生成呢?我们就是通过这个工具来生成的.
官方网站: https://hutool.cn/
参考文档: https://hutool.cn/docs/#/

5.3 后端代码

  1. 引入Hutool依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.22</version>
</dependency>
  1. 写出验证码的配置项与验证码配置项所对应的类.并注入IoC容器.
captcha:width: 100height: 40session:key: CAPTCHA_SESSION_KEYdate: KAPTCHA_SESSION_DATE

配置项中对应的分别是验证码的长和宽,还有用于存储验证码和过期时间.

@Component
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {public Integer width;public Integer height;public Session session;public static class Session{public String key;public String date;}
}
  1. 调整生成验证码的Controller代码
@RestController
@RequestMapping("/captcha")
public class CaptchaController {@Autowiredpublic CaptchaProperties captchaProperties;@RequestMapping("/getCaptcha")public void getCaptcha(HttpServletResponse response, HttpSession session) throws IOException {//可以通过这个参数拿到响应中的所有信息LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(),captchaProperties.getHeight());//创建线条干扰验证码//图形验证码写出,可以写出到文件,也可以写出到流response.setContentType("image/jpeg");//从响应中获取到类型信息,设置为图片格式response.setHeader("Pragma","No-cache");//从响应中获取到Header,把Pragma键值对设置为没有缓存.try {lineCaptcha.write(response.getOutputStream());//把验证码放入session中session.setAttribute(captchaProperties.getSession().getKey(),lineCaptcha.getCode());//把过期时间放入session中session.setAttribute(captchaProperties.getSession().getDate(),System.currentTimeMillis());response.getOutputStream().close();//关闭输出流} catch (IOException e) {throw new RuntimeException(e);}}
}

接下来我们来访问网页来观察验证码是否生成成功.
在这里插入图片描述
验证码生成成功.

  1. 校验验证码
    public static final Integer MAX_WAIT_MILLS = 60*1000;@RequestMapping("/check")public boolean checkCaptcha(HttpSession session,String captcha){if (!StringUtils.hasLength(captcha)){//判断验证码是否有长度return false;}String sessionCode = (String) session.getAttribute(captchaProperties.getSession().getKey());Long sessionDate = (Long) session.getAttribute(captchaProperties.getSession().getDate());if (captcha.equalsIgnoreCase(sessionCode) &&System.currentTimeMillis()-sessionDate < MAX_WAIT_MILLS){return true;//验证码和用户输入的等同且}return false;}

5.4 前端代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>验证码</title><style>#inputCaptcha {height: 30px;vertical-align: middle; }#verificationCodeImg{vertical-align: middle; }#checkCaptcha{height: 40px;width: 100px;}</style>
</head><body><h1>输入验证码</h1><div id="confirm"><input type="text" name="inputCaptcha" id="inputCaptcha"><img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?换一张" /><input type="button" value="提交" id="checkCaptcha"></div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$("#verificationCodeImg").click(function(){$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({url: "/captcha/check",type: "post",data: { captcha: $("#inputCaptcha").val() },success: function (result) {if (result) {location.href = "success.html";} else {alert("验证码错误");$("#inputCaptcha").val("");}}});});</script>
</body></html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证成功页</title>
</head>
<body><h1>验证成功</h1>
</body>
</html>

测试运行:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

主流大数据调度工具DolphinScheduler之数据采集

今天继续给大家分享主流大数据调度工具DolphinScheduler&#xff0c;以及数据的ETL流程。 一&#xff1a;调度工具DS 主流大数据调度工具DolphinScheduler&#xff0c; 其定位&#xff1a;解决数据处理流程中错综复杂的依赖关系 任务支持类型&#xff1a;支持传统的shell任…

数据结构之字符串的最长公共子序列问题详解与示例(C,C++)

文章目录 1、最长公共子序列定义2、动态规划解法3、状态转移方程初始化构建最长公共子序列 4、C 和 C 实现示例C 语言实现C 语言实现 5、总结 字符串的最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是计算机科学中的一个经典问题&#xff0c;属于动态…

接口开发:Orcal数据库的批量新增sql

场景&#xff1a;在日常的CURD中一定会用到批量新增。在我们的项目中&#xff0c;使用的数据库是Orcal&#xff0c;由于之前基本都是使用Mysql的&#xff0c;使用的sql语句也基本都是用mysql的。但是在这次的接口编写时用mysql的批量新增出了问题&#xff0c;刚开始我还以为是写…

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…

安装 VMware vSphere vCenter 8.0

安装 VMware vSphere vCenter 8.0 1、运行安装程序 2、语言选择中文 3、点下一步 4、接受许可协议&#xff0c;点下一步 5、填写部署vCenter服务的ESXI主机IP地址以及对应ESXI主机的账号密码&#xff0c;这里将vCenter服务部署在192.168.1.14这台ESXi主机上 6、接受证书警告 7…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中&#xff0c;网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框&#xff0c;还是更复杂的模态对话框&#xff0c;都可能中断测试脚本的正常执行&#xff0c;导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…

21k star 开源项目,让模糊图像秒变高清!

不知道大家有没有遇到这样的需求&#xff1a;电脑里有一些很久之前保存的好看的图片&#xff0c;但是因为分辨率不高&#xff0c;当做壁纸使用会变得模糊。或者是从网上下载的需要使用的图片&#xff0c;找不到更高清的版本导致使用效果不好。之前分享过基于 Real-ESRGAN 算法修…

Redis中的哨兵(Sentinel)

上篇文章我们讲述了Redis中的主从复制&#xff08;Redis分布式系统中的主从复制-CSDN博客&#xff09;&#xff0c;本篇文章针对主从复制中的问题引出Redis中的哨兵&#xff0c;希望本篇文章会对你有所帮助。 文章目录 一、引入哨兵机制 二、基本概念 三、主从复制的问题 四、哨…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客&#xff0c;如果一切顺利&#xff0c;会不定期更新。 如果感觉不妥&#xff0c;可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…

【题解 Kruskal重构树 LCA】 星际导航

星际导航 分析&#xff1a; 这也是一个比较老的题目了 今天突然想学一下kruskal重构树&#xff0c;就做到了这个题。 首先我们要明白&#xff0c;为什么这道题的路径一定是在最小生成树里&#xff1f; 或许是我们惯有的经验&#xff1a;最小的最大或者最大的最小无非两种套路…

信号【Linux】

文章目录 信号处理方式&#xff08;信号递达&#xff09;前后台进程 终端按键产生信号kill系统调用接口向进程发信号阻塞信号sigset_tsigprocmasksigpending内核态与用户态&#xff1a;内核空间与用户空间内核如何实现信号的捕捉 1、信号就算没有产生&#xff0c;进程也必须识别…

【C++】C++类和对象详解(上)

目录 思维导图大纲&#xff1a; 思维方面&#xff1a; 1. 类的定义&#xff1a; 2. 类的特点&#xff1a; 3. this指针&#xff1a; 4. 类的默认成员函数 默认构造函数 1.构造函数 2.析构函数 3.拷贝构造函数 4. 赋值运算符重载 1. 运算符重载 5. 日期类实现&#…

【CPP】CPP的内存管理

目录 10 C/C内存管理10.1 内存分布10.2 C的动态内存管理10.3 C的内存管理10.4 new失败的检测10.5 operator new与operator delete函数10.5 new与malloc()的区别,delete与free()的区别10.6 定位new表达式 这里是oldking呐呐,感谢阅读口牙!先赞后看,养成习惯! 个人主页:oldking呐…

编程中的智慧四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

使用Diffusion Models进行街景视频生成

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;街景图生成相当有挑战性&#xff0c;目前的文本到视频的方法仅限于生成有限范围的场景的短视频&#xff0c;文本到3D的方法可以生成单独的对象但不是整个城市。除此之外街景图对一致性的要求相当高&#x…

数据库基础与安装MYSQL数据库

一、数据库管理系统DBMS 数据库技术是计算机科学的核心技术之一&#xff0c;具有完备的理论基础。使用数据库可以高效且条理分明地存储数据&#xff0c;使人们能够更加迅速、方便地管理数据 1.可以结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问 2.可以…

目前航空航天设备怎么减重设计

目前航空航天设备怎么减重设计 1.使用轻质高强度材料1.1复合材料1.2金属基复合材料1.3陶瓷基复合材料1.4功能梯度材料和蜂窝材料 2.结构优化设计2.1拓扑优化2.2仿生学设计 3.部件和系统轻量化3.1机载娱乐系统3.2航空线缆3.3激光焊接技术 4.发动机和推进系统的优化4.1轻量化发动…

python爬虫Selenium模块及测试案例详解

什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driver&#xff08;FirfoxDrive…

python gradio 的输出展示组件

HTML&#xff1a;展示HTML内容&#xff0c;适用于富文本或网页布局。JSON&#xff1a;以JSON格式展示数据&#xff0c;便于查看结构化数据。KeyValues&#xff1a;以键值对形式展示数据。Label&#xff1a;展示文本标签&#xff0c;适用于简单的文本输出。Markdown&#xff1a;…