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共存,但⼀个项⽬中建议使⽤⼀种配置类型⽂件

相关推荐
向前看-1 小时前
验证码机制
前端·后端
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭3 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白663 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp4 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea