SpringBoot配置文件

目录

1 SpringBoot配置文件

2 配置文件的快速入手

3 配置文件格式

4 properties配置文件说明

4.1 properties基本语法

4.2 读取配置文件

4.3 properties缺点

5 yml配置文件

5.1 yml基本语法

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

5.3 配置对象 

5.4 配置集合

5.5 配置Map

5.6 yml优缺点

6 综合性练习

6.1 验证码案例

6.2 Kaptcha插件

6.2.1 原理

6.2.2 引入依赖

6.2.3 生成验证码

6.3 页面生成验证码

6.3.1 准备工作

6.3.2 约定前后端交互接口

6.3.3 实现服务器端代码

6.3.4 调整前端代码

6.3.5 运行测试

7 总结 

1 SpringBoot配置文件

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

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

1)项目的启动端口 

2)数据库的连接信息

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

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

2 配置文件的快速入手

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

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配置如下:

mykey.key=123
@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注解即可,实现代码如下

@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值加单双引号 

string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."
@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 配置对象 

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

使用 @ConfigurationProperties来进行读取即可

5.4 配置集合

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

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

dbtype:
  name:
    - mysql
    - sqlserver
    - db2

 

5.5 配置Map

maptype:
  map:
    k1: 1
    k2: 2
    k3: 3
@Component
@ConfigurationProperties(prefix = "maptype")
@Data
public class Map {
    private HashMap<String,String> map;
}
@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 引入依赖

<dependency>
    <groupId>com.oopsguy.kaptcha</groupId>
    <artifactId>kaptcha-spring-boot-starter</artifactId>
    <version>1.0.0-beta-2</version>
</dependency>

6.2.3 生成验证码

通过配置文件生成验证码

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 实现服务器端代码

引入依赖

<dependency>
    <groupId>com.oopsguy.kaptcha</groupId>
    <artifactId>kaptcha-spring-boot-starter</artifactId>
    <version>1.0.0-beta-2</version>
</dependency>

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

kaptcha:
  items:
    admin:
      path: /admin/captcha
      session:
        key: ADMIN_KAPTCHA_SESSION_KEY
        date: ADMIN_KAPTCHA_SESSION_DATE

验证码检验

@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 调整前端代码

$("#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可以共存,但是项目中建议使用一种配置类型文件

上一篇:Spring-Mybatis-Xml管理(动态sql语句,sql语句复用)


下一篇:【经典算法】LeetCode 111 二叉树的最小深度(Java/C/Python3/Go实现含注释说明,Easy)-相似题目