Spring Boot 配置文件

博主主页: 码农派大星.

数据结构专栏 :Java数据结构

数据库专栏: MySQL数据库

JavaEE专栏: JavaEE

软件测试专栏 :软件测试

关注博主带你了解更多知识

目录

[1. SpringBoot配置⽂件](#1. SpringBoot配置⽂件)

[1.1 很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:](#1.1 很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:)

[2. 配置文件快速入手](#2. 配置文件快速入手)

[3. 配置⽂件的格式](#3. 配置⽂件的格式)

[3.1 说明](#3.1 说明)

[4. properties 配置⽂件说明](#4. properties 配置⽂件说明)

[4.1 properties 基本语法](#4.1 properties 基本语法)

[4.2 读取配置⽂件](#4.2 读取配置⽂件)

[5. yml配置⽂件说明](#5. yml配置⽂件说明)

[5.1 yml基本语法](#5.1 yml基本语法)

[5.2 yml配置读取](#5.2 yml配置读取)

5.2.1配置对象

5.2.2配置集合

5.2.3配置Map

[5.3 注意事项:value值加单双引号](#5.3 注意事项:value值加单双引号)

[5.4 yml优缺点](#5.4 yml优缺点)

6.验证码案例

[6.1 需求](#6.1 需求)

[6.2 约定前后端交互接⼝](#6.2 约定前后端交互接⼝)

需求分析

接⼝定义

请求:

响应:

[6.3 借助Hutool⼯具](#6.3 借助Hutool⼯具)

[6.4 实现服务器端代码](#6.4 实现服务器端代码)

[6.5 调整前端代码](#6.5 调整前端代码)

[6.6 验证结果](#6.6 验证结果)

[7. 总结](#7. 总结)


1. SpringBoot配置⽂件

配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏.

在 Spring Boot 应用中,配置文件是用来定义应用配置的重要部分,包括数据库连接信息、服务地址、第三方 API 密钥等。Spring Boot 支持多种类型的配置文件,最常用的是 yml 和 properties 文件

1.1 很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:

• 项⽬的启动端⼝

• 数据库的连接信息(包含⽤⼾名和密码的设置)

• 第三⽅系统的调⽤密钥等信息 • ⽤于发现和定位问题的普通⽇志和异常⽇志等

2. 配置文件快速入手

SpringBoot内置了Tomcat服务器,默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他 应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号

我们可以通过配置⽂件来修改服务的端⼝号:

修改 application.properties ⽂件:

server.port=10086

显⽰Tomcat启动端⼝号为10086

3. 配置⽂件的格式

Spring Boot 配置⽂件有以下三种:

application.properties

application.yml

application.yaml

yml为yaml的简写,实际开发中出现频率最⾼. 使⽤ yaml和yml的使⽤⽅式⼀样

3.1 说明

1 .properties 和 .yml 可以并存在于⼀个项⽬中,但当两个并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以 .properties 优先级更⾼.

2 . 虽然理论上来讲 .properties 可以和 .properties 和 .yml .properties 为主,也就是 .yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护

4. properties 配置⽂件说明

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

4.1 properties 基本语法

properties 是以键值的形式配置的,key和value之间是以"="连接的

spring.application.name=config-demo

font.size=14px

4.2 读取配置⽂件

在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解使⽤" ${} "的格式读取

@RequestMapping("/prop")
@RestController
public class PropertiesController {
    @Value("${font.size}")
    private String fontSize;

    @RequestMapping("/readValue")
    public String readValue(){
        return "fontSize:" + fontSize;
    }
}

最终执行效果:

5. yml配置⽂件说明

5.1 yml基本语法

yml是树形结构的配置⽂件,它的基础语法是"key:value".

key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略

mykey: value1

5.2 yml配置读取

5.2.1配置对象

 student:
   id: 1
   name: Java
   age: 18

如果配置的是一个对象,那么就不能使用@Value来读取,应该使用@ConfigurationProperties

@ConfigurationProperties(prefix = "student")
 @Component
 @Data
 public class Student {
 private int id;
 private String name;
 private int age;
 }

5.2.2配置集合

//配置文件
 dbtypes:
   name:
	 - mysql
	 - sqlserver
	 - db2
//其他类	 
@ConfigurationProperties("dbtypes")
 @Data
 public class ListConfig {
 private List<String> name;
 }

5.2.3配置Map

//配置文件
 maptypes:
   map:
 	k1: kk1
 	k2: kk2
 	k3: kk3
//其他类
@Component
 @ConfigurationProperties("maptypes")
 @Data
 public class MapConfig {
 private HashMap<String,String> map;
 }

5.3 注意事项:value值加单双引号

 string:
 str1: Hello \n Spring Boot.
 str2: 'Hello \n Spring Boot.'
 str3: "Hello \n Spring Boot."

字符串默认不⽤加上单引号或者双引号。

单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串.

双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义

5.4 yml优缺点

优点:

  1. 可读性⾼,写法简单, 易于理解

  2. ⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.

  3. ⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤

缺点:

1.不适合写复杂的配置⽂件

  1. 对格式有较强的要求

6.验证码案例

6.1 需求

  1. ⻚⾯⽣成验证码

  2. 输⼊验证码,点击提交,验证⽤⼾输⼊验证码是否正确,正确则进⾏⻚⾯跳转

6.2 约定前后端交互接⼝

需求分析

后端需要提供两个服务

  1. ⽣成验证码,并返回验证码

  2. 校验验证码是否正确:校验验证码是否正确

接⼝定义

请求:
  1. ⽣成验证码

    请求URL: /captcha/get

浏览器给服务器发送⼀个/captcha/get这样的请求,服务器返回⼀个图⽚,浏览器显⽰在⻚⾯上

  1. 校验验证码是否正确

    请求:/captcha/check

captcha: ⽤⼾输⼊的验证码

响应:
 true

6.3 借助Hutool⼯具

验证码的实现,使⽤Hutool提供的⼩⼯具来实现

引⼊依赖

<dependency>
 <groupId>cn.hutool</groupId>
 <artifactId>hutool-captcha</artifactId>
 <version>5.8.22</version>
 </dependency>

6.4 实现服务器端代码

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ICaptcha;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.lang.Console;
import com.VerificationCode.demo.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
@RequestMapping("/captcha")
@RestController
public class VerificationController {
    @Autowired
    private CaptchaProperties captchaProperties;
    private long VALID_TIME = 60*1000;

    @RequestMapping("/get")
    public void getCaptcha(HttpSession session,HttpServletResponse response) throws IOException {

        ICaptcha captcha = CaptchaUtil.createLineCaptcha(
                captchaProperties.getWidth(), captchaProperties.getHeight());

        captcha.write(response.getOutputStream());
        //禁止缓存
        response.setHeader("Prama","No-cache");
        //设置返回格式
        response.setContentType(("/image.jpeg"));
        //打印验证码
        System.out.println(captcha.getCode());
        //存储session
        session.setAttribute(captchaProperties.getSession().getCode(),captcha.getCode());
        session.setAttribute(captchaProperties.getSession().getDate(),System.currentTimeMillis());
        response.getOutputStream().close();
        //Servlet的OutputStream记得自行关闭哦!
    }

    @RequestMapping("/check")
    public Boolean check(String captchaCode,HttpSession session){
        //参数校验
        //判断用户输入是否和session一致
        //判断是否在有效期内
        if(!StringUtils.hasLength(captchaCode)){
            return false;
        }
        String sessionCode = (String)session.getAttribute(captchaProperties.getSession().getCode());
        Long sessionDate = (Long)session.getAttribute(captchaProperties.getSession().getDate());
        if(captchaCode.equals(sessionCode) && sessionDate != null && System.currentTimeMillis()-sessionDate
                <  VALID_TIME ){

            return true;
        }
        return false;


    }

}

把配置项挪到配置⽂件中

captcha:
  width: 100
  height: 40
  session:
    code: SESSION_CODE
    date: SESSION_DATE

把⽣成的验证码存储在Session中,校验时使⽤

验证码配置项对应的Java对象

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session;
@Data
   public static class Session{
        private String code;
        private String date;
    }
}

6.5 调整前端代码

<script>
    
    $("#verificationCodeImg").click(function(){
      $(this).hide().attr('src', '/captcha/get?dt=' + new Date().getTime()).fadeIn();
    });

    $("#checkCaptcha").click(function () {

      $.ajax({
        type:"post",
        url: "/captcha/check",
        data:{
          captchaCode: $("#inputCaptcha").val()
        },
        success:function(result){
          if(result){
            location.href = "success.html";
          }else{
            alert("验证错误,码有问题!")
          }
        }
      });
        
      
    });

  </script>

6.6 验证结果

7. 总结

  1. properties 是以key=value的形式配置的键值类型的配置⽂件,yml使⽤的是树形配置⽅式.

  2. 读取配置⽂件内容,使⽤ @Value 注解,注解内使⽤" ${} "的格式读取.

  3. yml层级之间使⽤换⾏缩进的⽅式配置,key和value之间使⽤":"加空格的⽅式设置,并且空格不可省略.

  4. properties 为早期并且默认的配置⽂件格式,其配置存在⼀定的冗余数据,使⽤yml可以很好的解决 数据冗余的问题,但不适合复杂配置.

  5. yml可以和properties共存,但⼀个项⽬中建议使⽤⼀种配置类型⽂件

相关推荐
xmh-sxh-13147 分钟前
jdk各个版本介绍
java
XINGTECODE20 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码26 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶26 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺31 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序38 分钟前
vue3 封装request请求
java·前端·typescript·vue
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 小时前
Spring Boot 注解
java·spring boot
先天牛马圣体1 小时前
如何提升大型AI模型的智能水平
后端