[Spring] Spring配置文件

news2025/1/12 8:57:48

🌸个人主页: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=false
    name: root
    password: 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;
    @PostConstruct
    public 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: 1
  name: java
  age: 20

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

@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
    public Integer id;
    public String name;
    public Integer age;
}
@RestController
public class StudentController {
    @Autowired
    private Student student;
    @PostConstruct
    public 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;
    }

    @Override
    public 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 {
    @Autowired
    public ListConfig listConfig;
    @PostConstruct
    public void readList(){
        System.out.println(listConfig);
    }
}

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

4.2.6 配置map

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

maptypes:
  map:
    k1: v1
    k2: v2
    k3: v3
@Component
@Data
@ConfigurationProperties(prefix = "maptypes")
public class MapConfig {
    //注意字段名的一致性
    public Map<String,String> map;
}
@RestController
public class ReadYml3 {
    @Autowired
    public MapConfig mapConfig;
    @PostConstruct
    public 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: 100
  height: 40
  session:
    key: CAPTCHA_SESSION_KEY
    date: 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 {
    @Autowired
    public 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.coloradmin.cn/o/1941339.html

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

相关文章

Spring推出Spring AI框架,看看怎么个事

文章目录 概述SpringAI介绍Spring AI 提供以下功能支持的聊天模型有哪些支持的文生图的模型有哪些支持的音频到文本模型支持的嵌入模型有哪些支持的矢量数据库有哪些 概述 在当今快速发展的技术时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的关键驱动…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个&#xff0c;其语法如下&#xff1a; expression?value1:value2 这是一个三目运算符&#xff0c;当表达式 expre…

#三元运算符(python/java/c)

引入&#xff1a;什么是三元运算符呢&#xff1f;无疑其操作元有三个&#xff0c;一个是条件表达式&#xff0c;剩余两个为值&#xff0c;条件表达式为真时运算取第一个值&#xff0c;为假时取第二个值。 一 Python true_expression if condition else false_expressi…

网络通讯实验报告

拓扑图 需求 1、通过DHCP服务&#xff0c;给PC4和PC5分配IP地址、网关、掩码、DNS服务器IP地址 2、Client-1要求手工配置IP地址&#xff0c;为192.168.1.1, c 3、telnet客户端可以远程登录telnet服务器进行设备管理&#xff0c;并成功修改telnet服务器的名字为123 &#xff0c…

两轮差速拖动机械臂瞄准接收口目标

下图所示&#xff0c;关节2为无动力旋转关节&#xff0c;关节4为无动力移动关节&#xff0c;关节5为旋转关节&#xff0c;差速轮可绕轮中心点4自由旋转&#xff0c;差速轮带动2和4关节运动。设计差速轮和机械臂解算方法&#xff0c;使其相互配合到达接收口&#xff0c;瞄准目标…

树上前缀和树状数组结合

怎么去分析这个题目&#xff0c;一开始我想的就是暴力dfs&#xff0c;接着枚举删除的节点&#xff0c;但是只过了百分之四十个点&#xff0c;代码如下&#xff1a;(这个代码有点像树形dp&#xff09; #include<bits/stdc.h> using namespace std;#define int long long c…

SHL笔试测评题型题库大揭秘适用公司通过技巧神助攻

⭕SHL题库外企应用的比较多&#xff0c;整体来看分为三类。 ✅第一类是综合能力&#xff0c;考察综合素质&#xff0c;要求36分钟完成24道题&#xff0c;适用范围最广。题型有安排时间问题、比例题、记忆题、排序题、日历题、图形变换题、图形推理题、拖线条题等等&#xff0c…

Linux_生产消费者模型

目录 1、生产消费者模型示意图 2、生产者消费者之间的关系 3、定义交易场所 4、实现生产消费者模型 5、伪唤醒 6、多生产多消费者的实际运用 7、POSIX信号量 7.1 初始化信号量 7.2 销毁信号量 7.3 等待信号量 7.4 发布信号量 8、生产消费的环形队列模型 8.1…

接口测试之测试原则、测试用例、测试流程详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&…

AWS云服务器购买:亚马逊云服务器的价格真的那么贵吗?一年要花多少钱?

亚马逊云服务器是全球领先的云计算服务提供商之一&#xff0c;其服务覆盖全球多个地区&#xff0c;拥有众多的客户和合作伙伴。然而&#xff0c;对于很多人来说&#xff0c;AWS的价格一直是一个热门话题。那么&#xff0c;亚马逊云服务器的价格真的那么贵吗&#xff1f;一年要花…

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

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

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

怎么把照片变漫画?学会这几招让照片秒变漫画

在这个追求图片创意与趣味性的时代&#xff0c;照片的“变身”游戏正悄然风靡。 从滤镜的巧妙运用到拍摄姿势的创新突破&#xff0c;人们不断探索着让照片焕发新生的无限可能。 而今&#xff0c;一股将照片转化为漫画风格的新潮流正席卷而来&#xff0c;它不仅保留了照片的记…

【PPT方案】大数据湖建设方案

背 景&#xff1a;大数据湖的发展背景与建设理念 体 系&#xff1a;大数据湖体系规划与建设思路 生态圈&#xff1a;探索新兴业务入湖建设模式 共 享&#xff1a;大数据湖统一访问共享规划 运 营&#xff1a;大数据湖一体化运营管理建设 软件全套资料部分文档清单&…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…

Java二十三种设计模式-装饰器模式(7/23)

装饰器模式&#xff1a;动态扩展功能的灵活之选 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改对象自身的基础上&#xff0c;通过添加额外的职责来扩展对象的功能。 基础知识&#xff0c;java设计模式总体来说设计…

MT19937

MT19937 文章目录 MT19937题型1 逆向extract_number[SUCTF2019]MT 题型2 预测随机数[GKCTF 2021]Random 题型3逆向twist[V&N2020 公开赛]Backtrace 题型4 逆向init扩展题型WKCTF easy_random 现成模块randcrack库Extend MT19937 Predictor库 MT19937是一种周期很长的伪随机…

【C++】深刻基础笔记

目录 关于debug&#xff1a; 多文件编译&#xff1a; 编译器工作原理 预处理&#xff1a; 如何将机器二进制转换成可以看懂的文件 链接器的工作原理 Pointers指针 Reference引用 C线程 程序如何从源文件变成exe可执行文件&#xff1f; 首先是预处理器#include <..…

斐波那契数列的多种解法 C++实现,绘图部分用Python实现

斐波那契数列的多种解法 C实现&#xff0c;绘图部分用Python实现 flyfish 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个经典的数列&#xff0c;定义如下&#xff1a; { 0 if n 0 1 if n 1 F ( n − 1 ) F ( n − 2 ) if n > 1 \begin{cases} 0 &…

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…