Spring Boot 配置文件

时间:2024-11-09 09:10:16

 博主主页: 码农派大星.

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

 数据库专栏:MySQL数据库

JavaEE专栏:JavaEE

软件测试专栏:软件测试

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

目录

1. SpringBoot配置⽂件

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

2. 配置文件快速入手

3. 配置⽂件的格式 

3.1 说明 

4. properties 配置⽂件说明 

4.1 properties 基本语法 

4.2 读取配置⽂件 

5. yml配置⽂件说明 

5.1 yml基本语法

 5.2 yml配置读取

5.2.1配置对象

 5.2.2配置集合

5.2.3配置Map

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

5.4 yml优缺点

6.验证码案例

6.1 需求

6.2 约定前后端交互接⼝ 

需求分析

接⼝定义

请求:

响应: 

6.3 借助Hutool⼯具

6.4 实现服务器端代码

 6.5 调整前端代码

6.6 验证结果

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.不适合写复杂的配置⽂件

2. 对格式有较强的要求 

6.验证码案例

6.1 需求

1. ⻚⾯⽣成验证码

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

6.2 约定前后端交互接⼝ 

需求分析

后端需要提供两个服务

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

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

接⼝定义

请求:

1. ⽣成验证码

请求URL: /captcha/get

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

2. 校验验证码是否正确 

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