一、回顾
二.如何配置端口号
配置文件,最重要的目的:解决硬编码问题-代码写死
1.常见配置项
使用阶段
Spring配置文件,有三种格式
事实上是:SpringBoot只支持三个文件 1.application.properties 2.application.yaml 3.application.yml 二和三一致,是一样的,只是后缀名字不一样
1.properties
2.yaml (2和3是一个)
3.yml(yaml,缩写,后缀名字不同而已,现在yml更多)
如果项目中,同时存在properties和yml,properties的优先级更高
企业开发中,通常只使用其中一个文件
配置文件格式
properties(这个key-value的键值对格式):
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test....省略
如何获取配置项:
//properties里面写这个东西 demo.key1=hello.properties
package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class PropertiesController { //使用@Value注解 @Value("${demo.key1}") private String key1; @RequestMapping("readKey") public String readKey(){ return "读取到的配置项key1"+key1; } }
去掉$符号之后,他就不取出来配置项,而是把配置项当成字符串打印了
yml文件格式(把.换成冒号+换行,注意端口号那里有空格,⚠️格式要求比较严格,空格不可以省略)
server:
port: 8081
要从左边开始写,就像是废物python
#数据库的相关配置 spring: datasource: url: jdbc... password: root username: root
yml获取配置项
demo:
key1: hello,yml
@RestController public class YmlController { @Value("${demo.key1}") public String key1; @RequestMapping("/readYml") public String readYml(){ return key1; } }
多次获取配置项(yml会对我们的参数情况,进行的一定类型转换比如数字10,转换成“10”)
null:使用key后面+-(破折号)
空字符串:key后面之间空着,但是不易读,推荐使用单引号或者双引号扩起来
转义字符
言语可能有些迷惑:慢慢品尝 单引号会对特殊字符进行转义,双引号不会进行转义 原因:\n本身的含义是换行 使用单引号时,内容就表示成了\n,而不是换行,所以认为是转义 使用双引号时候,\n表示成了换行,也就是\n本来的含义(换句话说,他本来就是个女的,你镜子照之后,他还是个女的,你没有那个转义功能)
赋值给对象
package com.example.demo; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component //下面这个的含义是说从配置文件中获取这个student给这个对象赋值 @ConfigurationProperties(prefix = "student") @Data public class Student { private Integer id; private String name; private Integer age; } //这个是使用的时候记得要加Autowired //@Autowired // public Student student;
赋值给集合:
假如不加空格,那么这些会变成一个整体,一起赋值给name,长度变成1了
yml优缺点
优点:可读性高,写法简单,易于理解
可支持更多的数据类型,可以简单的表达对象,数组,List,Map等集合之类的
支持更多的编程语言
缺点:不适合写复杂的配置文件(格式要求严格)
与之带来的功能:
热部署:
写的代码,立即被加载,生效了
热加载:
如果代码发生了变动,就会重新部署
如何实现验证码
客户端和服务端都可以生产
1.后端引入依赖
三、日志代表的信息:
左边是时间,INFO表示级别,3353表示当前的PID
main(进程),com....(打印日志的类),(后面那些是日志内容)
spring帮我们集成了很多的框架
下面是日志的写法
package com.example.captcha1.demos.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController public class LoggerController { //从日志工厂(是一个工厂模式),拿到类一个日志对象,要传一个日志名称 private static Logger logger= LoggerFactory.getLogger(LoggerController.class); //这就是相当于起了个进程名字,但是推荐不要这么起名字,最好是要去找到当前进程。 // private static Logger logger= LoggerFactory.getLogger("lcl是大王"); @PostConstruct public void print(){ System.out.println("打印日志"); logger.info("__没毛病"); } }
选择当前选中的org
打印日志和正常print的区别,一个是正常的打印,另一个是如同spring的信息一样
一般日志的进程名建议是起名为当前类
外观模式(门面模式)
用来定义一个统一的接口,用来访问子系统中的一群接口,主要特征是定义一个高层接口,让子系统更容易去使用(像是我们之前写的图书管理系统),就像是家里的灯,要是有一个总开关,就能一个位置打开所有你想开的灯这种。
优点:
减少了系统的相互依赖,实现了客户端和子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端。
提高了灵活性,简化了客户端对于子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可
提高了安全性,可以灵活设定访问权限,不在门面对象中开通方法,就无法访问。
对于设计模式的理解
设计模式是为了解决生活中一些常见的问题的解决方案,就如同象棋中的别人选择当头炮,你选择上马一样,更像是一种套路,模版,可以让我们对身边的问题解决起来更方便。
日志冲突:版本bug,或者是不同框架的bug问题,引入第三方框架还要去不得不去维护多套框架(假如没有日志门面log4j,log4j本身是有他的一套规范,这样我们通过log4j就可以去放心调用)
日志当然也会影响一些性能,所以对于日志,要去适当使用。
日志的级别
日志如何去使用
package com.example.captcha1.demos.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController public class LoggerController { //从日志工厂,拿到类一个日志对象,要传一个日志名称 private static Logger logger= LoggerFactory.getLogger("lcl是大王"); @PostConstruct public void print(){ System.out.println("打印日志"); logger.info("__没毛病"); logger.error("我是傻子"); logger.warn("你是傻子"); logger.info("我们都不聪明"); logger.debug("你才傻傻都"); logger.trace("要不要去放烟花呀"); } }
我们可以看到他只显示了INFO以上的,但是INFO以下的没有显示,因为spring的基础设定是INFO普通事件,但是我们该怎么让这样显示呢?我们可以去配置。让他配置成初始debug级别
application.yml(配置文件)
logging: level: root: debug