Java Spring配置
文章目录
- Spring配置
- 配置文件
- properties的配置
- yml文件
- 配置对象
- 配置集合
- 配置map
- yml的优缺点
- 综合性练习
- 验证码的案例
Spring配置
配置文件
- 配置文件最重要的目的:解决硬编码(代码写死)的问题
比如在数据库中你的账号,密码是写死在你的代码中的,别人要使用你的数据库,就需要你把源码给别人,这是很麻烦的,所以才有了配置文件
- 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
- 如果项目中,同时存在properties和yml配置文件,properties的优先级更高
同时存在时,两个文件都生效,如果两个文件中,都包含同一个配置,以properties为主
企业开发中,通常只使用其中一个文件
properties的配置
注释通常使用快捷键:ctrl + / == # 或者是 == //
- 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
- properties文件获取属性值:
如果去掉$,就会把 " "中的值赋值给当前变量
这里是赋值给key,如果没有去掉 $ ,就是拿到配置文件中的值,$ 就相当于是取地址
自定义配置:
- properties的缺点分析:
这些配置文件比较冗余
yml文件
- yml文件比较严格,value(值前面必须要有一个空格)
- yml文件的配置:
# 修改端口号
server:port: 9091
# 数据相关的配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
- banner.txt是Spring的广告条配置,也可以自己修改这些广告条配置
下面这个就是Spring默认的广告条:
4. 想要查看 Spring Boot 更多系统配置项,访问官网:查看更多的配置文件
5. 在线banner.txt生成网站:banner生成
6. yml文件如何获取属性值:
7. 初始化方法打印配置文件中的内容:
domes:key1: hello,key1key2: key2key3: key3// Spring在对外提供方法之前,先进行初始化打印// 在tomcat启动前进行打印,不用在网页通过url上进行打印// 在初始化的时候进行打印@PostConstructpublic 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 是换行为转义的,没有换行就是没有转义的,也是可以的
配置对象
- 配置,配置内容的读取,注入
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;
}
配置集合
- 配置文件也可以配置list集合
dbtypes:
name:- mysql- sqlserver- db2
- yml配置集合的过程:
在YmlController文件中进行打印:
配置map
- 过程:
yml的优缺点
- 优点和缺点:
- 缺点的例子:
如果是复杂的配置,yml的可读性就比较差了
总结:
(1) 学习修改项目的端口号
(2) 学习properties和yml的语法
(3) 使用yml 配置对象,集合,map
yml也可以使用 . 进行分割
综合性练习
验证码的案例
-
验证码的插件:Kaptcha 插件,根据后端生成的验证码
-
验证码的实现:
客户端和服务器端都可以生成(主要的思路):
(1) 生成内容(根据词库)
(2) 生成干扰项
(3) 二者组成一个图片,返回
目的:重新获取请求,不让浏览器进行缓存,目的是每次都请求,都获取不一样的验证码
- get&post的区别:
(1) 查询的字符串的位置(get在url中,post在正文中,但是不是绝对的)
(2) get 有可能缓存(可能页面没有改变时,发现和上次一样就不进行重新获取页面,就进行拿取上次的缓存了) - 需要引入的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: 100height: 60textproducer:font:size: 36items:# home captchaadmin:path: /admin/captchasession:key: HOME_KAPTCHA_SESSION_KEYdate: 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 下一步
效果展示:
成功跳转:
跳转失败: