实用指南:Java Spring配置

Spring配置

配置文件

  1. 配置文件最重要的目的:解决硬编码(代码写死)的问题

比如在数据库中你的账号,密码是写死在你的代码中的,别人要使用你的数据库,就需要你把源码给别人,这是很麻烦的,所以才有了配置文件

  1. SpringBoot的配置文件,有三种格式:
    (1) properties
    (2) yaml
    (3) yml(yaml的简写)
    yaml和yml其实是同一个文件,只是后缀名不一样

事实上:SpringBoot只支持3个文件
1.application.properties
2.application.yaml
3.application.yml
企业中更多的是使用application.yml
但是idea会给我们自动配置application.properties

  1. 如果项目中,同时存在properties和yml配置文件,properties的优先级更高
    同时存在时,两个文件都生效,如果两个文件中,都包含同一个配置,以properties为主

企业开发中,通常只使用其中一个文件

properties的配置

注释通常使用快捷键:ctrl + / == # 或者是 == //

  1. properties的基本语法:

key value的形式,以 = 分割
key 的格式建议是小写,单词之间使用 . 分割

properties文件的配置:

// # server.port=8080
// #
// #server.port = 9090
# 配置数据库连接信息
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
// #自定义配置
// demos.key1 = hello,properties
  1. properties文件获取属性值:

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

这里是赋值给key,如果没有去掉 $ ,就是拿到配置文件中的值,$ 就相当于是取地址

自定义配置:
在这里插入图片描述

  1. properties的缺点分析:
    这些配置文件比较冗余
    在这里插入图片描述

yml文件

  1. yml文件比较严格,value(值前面必须要有一个空格)
    在这里插入图片描述
  2. yml文件的配置:
# 修改端口号
server:
port: 9091
# 数据相关的配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
username: root
password: root

在这里插入图片描述

  1. banner.txt是Spring的广告条配置,也可以自己修改这些广告条配置

下面这个就是Spring默认的广告条:
在这里插入图片描述
4. 想要查看 Spring Boot 更多系统配置项,访问官网:查看更多的配置文件
5. 在线banner.txt生成网站:banner生成
6. yml文件如何获取属性值:
在这里插入图片描述
7. 初始化方法打印配置文件中的内容:

domes:
key1: hello,key1
key2: key2
key3: key3
// Spring在对外提供方法之前,先进行初始化打印
// 在tomcat启动前进行打印,不用在网页通过url上进行打印
// 在初始化的时候进行打印
@PostConstruct
public void init(){
System.out.println("key1: " + key1);
System.out.println("key2: " + key2);
System.out.println("key3: " + key3);
}

在这里插入图片描述
8. 配置文件会自动地进行类型的转换:
在这里插入图片描述
9. 表明key3是一个null,而不是一个空串
在这里插入图片描述
10. 表明key3是一个空串,而不是null
表示一个空串,建议写成如下这样:

// 这两种都可以表示空串
key3: ''
key3: ""
// 不建议写成如下这样
key3:

在这里插入图片描述
总结:yml文件内容的特殊配置
在这里插入图片描述
11. 使用单引号和双引号的区别:

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

转义的意思,每个人的理解都不一样,如果面试官认为 \n 是换行为转义的,没有换行就是没有转义的,也是可以的
在这里插入图片描述

配置对象

  1. 配置,配置内容的读取,注入
    在这里插入图片描述
    Student类:
// @Component交给Spring进行管理
@Component
// 让配置文件中的对象和我们本身的对象进行映射
// @ConfigurationProperties从配置文件中读取数据,并且对属性进行赋值
// 读取以student为前缀的数据
@ConfigurationProperties(prefix = "student")
// @Data帮我们进行写get和set方法
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}

在这里插入图片描述

配置集合

  1. 配置文件也可以配置list集合
dbtypes:
name:
- mysql
- sqlserver
- db2
  1. yml配置集合的过程:
    在这里插入图片描述
    在这里插入图片描述
    在YmlController文件中进行打印:

在这里插入图片描述

配置map

  1. 过程:
    在这里插入图片描述

yml的优缺点

  1. 优点和缺点:
    在这里插入图片描述
  2. 缺点的例子:
    如果是复杂的配置,yml的可读性就比较差了
    在这里插入图片描述
    总结:
    (1) 学习修改项目的端口号
    (2) 学习properties和yml的语法
    (3) 使用yml 配置对象,集合,map

yml也可以使用 . 进行分割
在这里插入图片描述

综合性练习

验证码的案例

  1. 验证码的插件:Kaptcha 插件,根据后端生成的验证码

  2. 验证码的实现:
    客户端和服务器端都可以生成(主要的思路):
    (1) 生成内容(根据词库)
    (2) 生成干扰项
    (3) 二者组成一个图片,返回

在这里插入图片描述
目的:重新获取请求,不让浏览器进行缓存,目的是每次都请求,都获取不一样的验证码

  1. get&post的区别:
    (1) 查询的字符串的位置(get在url中,post在正文中,但是不是绝对的)
    (2) get 有可能缓存(可能页面没有改变时,发现和上次一样就不进行重新获取页面,就进行拿取上次的缓存了)
  2. 需要引入的jar包

可以再网页上显示一个变化的验证码

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

在这里插入图片描述
5. 验证码的配置文件

kaptcha:
image:
width: 100
height: 60
textproducer:
font:
size: 36
items:
# home captcha
admin:
path: /admin/captcha
session:
key:  HOME_KAPTCHA_SESSION_KEY
date: HOME_KAPTCHA_SESSION_DATE

显示的效果:
在这里插入图片描述
6. 后端进行验证码的验证工作:

package com.rzj.demo.controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
import java.util.Date;
@RequestMapping("/admin")
@RestController
public class CaptchaController {
// 企业标准:
// 常量定义: key: 单词全部大写,单词之间使用下划线分割
//         value: 通常是小写,以下划线分割
private final static String KAPTCHA_SESSION_KEY = "HOME_KAPTCHA_SESSION_KEY";
// 使用毫秒,定义一分钟就过期,时间通常使用表达式写
private static final Long SESSION_TIMEOUT = 60 * 1000L;
private static final String KAPTCHA_SESSION_DATE = "HOME_KAPTCHA_SESSION_DATE";
// 进行验证码的验证
// 验证成功: true
// 验证失败: false
/*
1. 从Session中获取到后端生成的验证码
2. 对比前端传过来的验证码是否和Session中的验证码是一样的
*/
@RequestMapping("/check")
public Boolean check(String captcha, HttpSession session){
// 前端传过来的验证码是空的
if(!StringUtils.hasLength(captcha)){
return false;
}
// 1. 从Session获取验证码
String saveCaptcha =(String)session.getAttribute(KAPTCHA_SESSION_KEY);
Date saveDate = (Date) session.getAttribute(KAPTCHA_SESSION_DATE);
// 2. 比对验证码
if(captcha.equals(saveCaptcha)){
// 3. 比对日期
if(saveDate == null || System.currentTimeMillis() - saveDate.getTime() < SESSION_TIMEOUT){
return true;
}
}
return false;
}
}

断点快捷键:
F8 下一步

效果展示:
在这里插入图片描述
成功跳转:
在这里插入图片描述
跳转失败:
在这里插入图片描述

posted @ 2025-11-12 04:47  ycfenxi  阅读(6)  评论(0)    收藏  举报