SpringBoot配置文件

目录

[1 SpringBoot配置文件](#1 SpringBoot配置文件)

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

[3 配置文件格式](#3 配置文件格式)

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

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

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

[4.3 properties缺点](#4.3 properties缺点)

[5 yml配置文件](#5 yml配置文件)

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

[5.2 yml配置不同数据类型及null](#5.2 yml配置不同数据类型及null)

[5.3 配置对象](#5.3 配置对象)

[5.4 配置集合](#5.4 配置集合)

[5.5 配置Map](#5.5 配置Map)

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

[6 综合性练习](#6 综合性练习)

[6.1 验证码案例](#6.1 验证码案例)

[6.2 Kaptcha插件](#6.2 Kaptcha插件)

[6.2.1 原理](#6.2.1 原理)

[6.2.2 引入依赖](#6.2.2 引入依赖)

[6.2.3 生成验证码](#6.2.3 生成验证码)

[6.3 页面生成验证码](#6.3 页面生成验证码)

[6.3.1 准备工作](#6.3.1 准备工作)

[6.3.2 约定前后端交互接口](#6.3.2 约定前后端交互接口)

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

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

[6.3.5 运行测试](#6.3.5 运行测试)

[7 总结](#7 总结)

1 SpringBoot配置文件

配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据并进行加载

SpringBoot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的,很多项目或者框架的配置信息也放在配置文件中,例如:

1)项目的启动端口

2)数据库的连接信息

3)第三方系统的调用密钥等信息

4)用于发现和定位问题的普通日志和异常日志等

2 配置文件的快速入手

Tomcat的默认端口是8080,所以在程序访问时的端口号也是8080,如果8080端口被占用了,则可以通过配置文件来修改服务的端口号,SpringBoot在创建项目时,就已经创建了配置文件

java 复制代码
server.port=9090

只需要修改application.properties文件即可,重新运行程序,观察日志

此时Tomcat启动端口为9090,因此访问的时候就需要使用9090这个端口来访问

3 配置文件格式

SpringBoot配置文件有三种:

1)application.properties

2)application.yml

3)application.yaml

yml为yaml的简写,实际开发中出现的频率最高,它们使用方式一样,因此只介绍yml文件的使用

特殊说明:

1)理论上.properties和.yml可以并存于一个项目中,当.properties和.yml并存时,两个配置都会加载,如果配置文件内容有冲突,则以.properties为主,因此.properties优先级更高

2)在实际业务中,通常采用一种统一的配置文件格式

4 properties配置文件说明

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

4.1 properties基本语法

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

4.2 读取配置文件

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

properties配置如下:

java 复制代码
mykey.key=123
java 复制代码
@RestController
public class PropertiesController {
    @Value("${mykey.key}")
    private String k;
    @RequestMapping("/key")
    public String key() {
        return "读取的值:"+ k;
    }
}

如果去掉$,就会把" "中的值赋值给当前变量

4.3 properties缺点

properties配置是以key-value的形式配置的,配置文件中有很多冗余信息

要解决这个问题,就可以使用yml配置文件的格式了

5 yml配置文件

yml是YAML的缩写,它的全称Yet Another Markup Language

5.1 yml基本语法

yml是树形结构的配置文件,**它的基础语法是"key:value",其中key和value之间使用英文冒号加空格的方式组成,**空格不可以省略

yml连接数据库代码展示

5.2 yml配置不同数据类型及null

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

java 复制代码
@RestController
public class PropertiesController {
    @Value("${string.key1}")
    private String k1;
    @Value("${string.key2}")
    private Integer k2;
    @Value("${string.key3}")
    private String k3;
    @PostConstruct
    public void init() {
        System.out.println("key1:" + k1);
        System.out.println("key2:" + k2);
        System.out.println("key3:" + k3);
        System.out.println(StringUtils.hasLength(k3));
    }
}

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

java 复制代码
string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."
java 复制代码
@RestController
public class PropertiesController {
    @Value("${string.str1}")
    private String str1;
    @Value("${string.str2}")
    private String str2;
    @Value("${string.str3}")
    private String str3;
    //@PostConstruct是在tomcat启动之前就打印
    @PostConstruct
    public void init() {
        System.out.println("str1:" + str1);
        System.out.println("str2:" + str2);
        System.out.println("str3:" + str3);
    }
}

从上述结果可以看出:

1)字符串默认不用加上单引号或者双引号

2)单引号会转译特殊字符,始终是一个普通字符串

3)双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义

5.3 配置对象

java 复制代码
student:
  id: 18
  name: zhangsan
  age: 19
java 复制代码
@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}
java 复制代码
@RestController
public class StudentController {
    @Autowired
    public Student student;
    @PostConstruct
    public void init() {
        System.out.println("student:" + student);
    }
}

使用 @ConfigurationProperties来进行读取即可

5.4 配置集合

java 复制代码
dbtype:
  name:
    -mysql
    -sqlserver
    -db2
java 复制代码
@Component
@ConfigurationProperties(prefix = "dbtype")
@Data
public class DBType {
    private String[] name;
}
java 复制代码
@RestController
public class DBTypeController {
    @Autowired
    private DBType dbType;
    @PostConstruct
    public void init() {
        System.out.println("dbtype:" + dbType + "length:" + dbType.getName().length);
    }
}

上述输出的长度为1,是因为yml里面的-和mysql之间没有加空格

java 复制代码
dbtype:
  name:
    - mysql
    - sqlserver
    - db2

5.5 配置Map

java 复制代码
maptype:
  map:
    k1: 1
    k2: 2
    k3: 3
java 复制代码
@Component
@ConfigurationProperties(prefix = "maptype")
@Data
public class Map {
    private HashMap<String,String> map;
}
java 复制代码
@RestController
public class MapController {
    @Autowired
    private Map map;
    @PostConstruct
    public void init() {
        System.out.println("map:" + map + "length:" + map.getMap().size());
    }
}

5.6 yml优缺点

优点:

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

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

3 支持更多的编程语言,不止在Java中可以使用,在Golang,Python中也可以使用

缺点:

1 不适合写复杂的配置文件

2 对格式有较强的要求(少写一个空格就会出错)

6 综合性练习

6.1 验证码案例

随着安全性的要求越来越高,在目前项目中都使用了验证码,而验证码的形式也是各种各样的

6.2 Kaptcha插件

6.2.1 原理

验证码可以客户端生成,也可以服务器生成,对于普通的字符验证码,后端代码通常分成两部分,一是生成验证码内容,根据验证码内容和干扰项等,生成图片并返回给客户端,二是把验证码内容存储起来,校验时取出来进行对比,kaptcha插件选择把验证码存储在Session⾥

6.2.2 引入依赖

java 复制代码
<dependency>
    <groupId>com.oopsguy.kaptcha</groupId>
    <artifactId>kaptcha-spring-boot-starter</artifactId>
    <version>1.0.0-beta-2</version>
</dependency>

6.2.3 生成验证码

通过配置文件生成验证码

java 复制代码
kaptcha:
  items:
    home:
      path: /home/captcha
      session:
        key: HOME_KAPTCHA_SESSION_KEY
        date: HOME_KAPTCHA_SESSION_DATE
    admin:
      path: /admin/captcha
      session:
        key: ADMIN_KAPTCHA_SESSION_KEY
        date: ADMIN_KAPTCHA_SESSION_DATE

直接通过http://127.0.0.1:8080/home/captcha访问即可

6.3 页面生成验证码

6.3.1 准备工作

创建项目,引入SpringMVC的依赖包,把前端页面放在项目中

6.3.2 约定前后端交互接口

需求分析

1)后端生成验证码并返回给前端

2)校验验证码受否正确

接口定义

1)生成验证码

请求:GET /admin/captcha

响应:图片内容

2)校验验证码是否正确

请求:POST /admin/check

响应:true

6.3.3 实现服务器端代码

引入依赖

java 复制代码
<dependency>
    <groupId>com.oopsguy.kaptcha</groupId>
    <artifactId>kaptcha-spring-boot-starter</artifactId>
    <version>1.0.0-beta-2</version>
</dependency>

通过配置文件创建验证码生成器

java 复制代码
kaptcha:
  items:
    admin:
      path: /admin/captcha
      session:
        key: ADMIN_KAPTCHA_SESSION_KEY
        date: ADMIN_KAPTCHA_SESSION_DATE

验证码检验

java 复制代码
@RequestMapping("/admin")
@RestController
public class CaptchaController {
    private static final String SESSION_KEY = "ADMIN_KAPTCHA_SESSION_KEY";
    private static final String SESSION_DATE ="ADMIN_KAPTCHA_SESSION_DATE";
    private static final Long SESSION_TIME = 60 * 1000L;

    @RequestMapping("/check")
    public Boolean check(String captcha, HttpSession session) {
        if (!StringUtils.hasLength(captcha)) {
            return false;
        }
        //从Session中获取验证码
        String saveCaptcha = (String)session.getAttribute(SESSION_KEY);
        Date saveDate = (Date) session.getAttribute(SESSION_DATE);
        //对比验证码
        if (captcha.equals(saveCaptcha)) {
            //对比日期
            if (saveDate == null || System.currentTimeMillis() - saveDate.getTime() < SESSION_TIME) {
                return true;
            }
        }
        return false;
    }
}

对比Session中存储的验证码是否和用户输入的一致,如果一致,并且试件在一分钟就认为成功

6.3.4 调整前端代码

javascript 复制代码
$("#checkCaptcha").click(function () {
      $.ajax({
        url: "/admin/check",
        type: "post",
        data: {
          captcha: $("#inputCaptcha").val()
        },
        success: function (result) {
          if (result) {
            location.href = "success.html";
          } else {
            alert("验证码错误");
          }
        }
      });
    });

6.3.5 运行测试

7 总结

1)properties是以key=value的形式配置的键值类型的配置文件,yml使用的是树形配置方式

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

3)yml层级之间使用换行缩进的方式配置,key和value之间使⽤":"(英⽂冒号)加空格的方式设置,并且空格不可省略

4)yml可以很好的解决数据冗余的问题,但不适合复杂设置

5)yml和properties可以共存,但是项目中建议使用一种配置类型文件

相关推荐
码出钞能力19 分钟前
linux内核模块的查看
linux·运维·服务器
考虑考虑35 分钟前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干43 分钟前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·1 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1232 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠2 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.3 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥3 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人3 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址