当前位置: 首页 > news >正文

Spring Boot 项目的创建、配置文件、日志

文章目录

  • Spring Boot 优点
  • 创建 Spring Boot 项目
    • 创建项目
    • 认识目录
    • 网页创建(了解)
  • 约定大于配置
  • Spring Boot 配置文件
    • 配置文件格式
    • 读取配置项
    • properties 配置文件
    • yml 配置文件
      • 基本语法
      • 进阶语法
      • 配置对象
      • 配置集合
      • yml 设置不同环境的配置文件
  • Spring Boot 日志文件
    • 看日志
    • 日志格式
    • 输出自定义日志
    • 将日志持久化
      • 设置日志名称
      • 设置日志保存路径
    • 设置日志级别 & 筛选日志
    • 更简单的日志输出——lombok
    • Lombok 的常用注解

Spring Boot 优点

  • 快速集成框架,Spring Boot 提供了启动添加依赖的功能,用于
  • 内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序
  • 快速部署项目,无需外部容器也可启动并运行项目
  • 可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发
  • 支持更多的监控的指标,可以更好地了解项目的运行情况

创建 Spring Boot 项目

创建项目

IDEA 社区版需要安装 Spring Boot Helper 插件,专业版不需要。

新建项目,选择 Spring Initializr,给项目取名,项目类型这里使用 Maven

img

选择 Next,在下面的页面选择 Spring Boot 版本和需要的依赖

img

这边选择了三个依赖,Lombok 可以用来快速构建Getter Setter方法。Spring Boot DevTools 用来支持热部署,Spring Web 用来实现网络编程。

选择 Create 开始创建项目,第一次创建会比较慢,需要下载的东西比较多,建议配置国内源。

启动项目,正常启动说明创建成功:

img

认识目录

首先将下面 4 个无用的文件删除

img

关于各目录的介绍:

img

网页创建(了解)

前往官网:https://start.spring.io/

img

在这里将选项配置好后,点击 GENERATE,会下载一个压缩包,解压,然后用 IDEA 打开即可。

约定大于配置

Spring 核心设计思想——约定大于配置,也就是说,能通过约定解决就不要去动配置文件。

比如我们在创建项目时自动生成的启动文件:

img

Spring Boot 约定,和这个文件同目录或在该目录的子目录下,对象才可以被注入到容器中。

在之前学习的 Spring 中,我们还需要在 xml 中注册 bean、配置扫描路径,Spring Boot 就不需要了。

例:

在 demo 下面创建 TestController 文件:

package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@RequestMapping("/hi")public String hi() {return "Hello";}
}

访问 http://localhost:8080/hi,输出 Hello

img

如果你把 TestController 文件移动到上级目录,比如 com 下面,再次访问就访问不到了。

img

Spring Boot 配置文件

配置文件格式

Spring Boot 配置文件主要分为以下两种格式:

  • .properties (项目创建时的默认格式)
  • .yml(新版配置文件格式)

在 Spring Boot 中,配置文件命名为 application.properties 或 application.yml

这两种配置文件的语法不一样,比如我们要设置端口号:

在 application.properties 下:

server.port=9090

在 application.yml 下

server:port: 9090

特别说明:

  • properties 和 yml 可以同时存在一个项目中,当它们同时存在一个项目中时,都会被加载,如果两个配置文件中出现了同样的配置,此时为以 properties 中的配置为主,也就是说 properties 配置文件的优先级最高。
  • 虽然两个格式的配置文件可以共存,但是实际业务中通常采取一种配置文件格式
  • 更多配置项,见官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
  • 用户可以自定义配置项

读取配置项

自定义一个配置项:

#自定义配置项
mykey.key1=hahaha

读取配置项:

使用 ${} 来读取配置项的值,非自定义配置项也可以通过这种方式来读取

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 TestController {@Value("${mykey.key1}")private String mykey;@RequestMapping("/hi")public String hi() {return mykey;}
}

结果:

img

注:这种方式只能读取基本数据类型,关于其他数据类型在下面的 yml 中会涉及到。

properties 配置文件

使用 # 来注释,使用键值对来进行配置。

例,配置数据库信息:

#设置端口号
server.port=9090
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

优点:

  • 写法简单

缺点:

  • 不够灵活

  • 容易乱码:

    比如我写的中文注释,重新打开的时候都变成了 ?

    #?????
    server.port=9090
    #??????????
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
    spring.datasource.username=root
    spring.datasource.password=123456#??????
    mykey.key1=hahaha
    

    这是编码问题导致的,properties 的默认编码格式是 ISO-8859-1

    解决方法,在设置里将编码改成 UTF-8(注意当前项目设置和新项目设置都要设置):

    img

yml 配置文件

基本语法

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

优点:

  • yml 可读性高,写法简单,语法和 JSON 类似
  • 支持更多的数据类型,可以简单表达清单(数组)、散列表、标题等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等
  • 支持更多的编程语言

yml 语法格式:

一级目录

key: value

: 后面的空格不可省略

多级目录

key:key2:key3: value

例:多级目录的系统配置项(数据库连接)

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8username: rootpassword: 123456

进阶语法

yml 支持很多数据类型:

#字符串
string: 'Hello, World!'
#整数
number: 42
#布尔
boolean: true
#null
null_value: null
#列表
list:- item1- item2- item3
#字典
dictionary:key1: value1key2: value2
#多行字符串
multiline_string: |This is a multilinestring in YAML.
#日期时间
date_time: 2023-12-06T12:34:56Z

注:

字符串使用不同的引号会有不同的效果,只有使用双引号的时候,特殊字符都会发挥作用。

例:

mykey:str1: aaa \n bbbstr2: 'aaa \n bbb'str3: "aaa \n bbb"
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 TestController {@Value("${mykey.str1}")private String mykey1;@Value("${mykey.str2}")private String mykey2;@Value("${mykey.str3}")private String mykey3;@RequestMapping("/hi")public String hi() {System.out.println("str1: " + mykey1);System.out.println("str2: " + mykey2);System.out.println("str3: " + mykey3);return null;}
}
/*输出:
str1: aaa \n bbb
str2: aaa \n bbb
str3: aaa bbb
*/

配置对象

  1. 原始写法

    student:id: 1name: zhangsanage: 18
    
  2. 行内写法

    student: {id: 1, name: zhangsan, age: 18}
    

读取配置的对象:

首先要把 Student 类定义出来,给这个类添加 @Component 注解,存到 Spring 中,添加 @ConfigurationProperties(prefix = "student") 注解,表示将配置文件中的 student 配置赋值给当前的对象(为了完成这一步,一定要添加 Setter 方法)。

package com.example.demo.model;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "student")
public class Student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

接下来我们去获取这个对象,这里采取属性注入的方式:

@RestController
public class TestController {@Autowiredprivate Student student;@RequestMapping("/hi")public String hi() {return student.getName() + " age: " + student.getAge();}
}

结果:

img

注意事项

  1. 读取配置文件的实体类不能没有 Setter 方法,@ConfigurationProperties 注解在实现时是通过 Setter 将配置文件中的内容赋值 给字段的
  2. @ConfigurationProperties 需要配合类注解一起使用

配置集合

  1. 原始写法

    mylist:dbtype:- mysql- sqlserver- db2
    
  2. 行内写法

    mylist: {dbtype: [mysql, sqlserver, db2]}
    

例:

首先定义 MyList 类,这次我们使用 lombok 中的 @Data 注解来自动生成 Getter 和 Setter 方法。

package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@ConfigurationProperties(prefix = "mylist")
@Component
public class MyList {private List dbtype;
}

获取并读取:

@RestController
public class TestController {@Autowiredprivate MyList myList;@RequestMapping("/hi")public String hi() {return "size: " + myList.getDbtype().size() + " get(0): " + myList.getDbtype().get(0);}
}

结果:

img

yml 设置不同环境的配置文件

创建 application-{profile}.yml 格式的配置文件,其中,{profile} 是指激活的环境配置文件的名称。例如,application-dev.yml 将用于开发环境,而 application-prod.yml 将用于生产环境。

application.propertiesapplication.yml 中设置 spring.profiles.active 属性来指定激活的环境。例如:

# application.properties
spring.profiles.active=dev

或者

# application.yml
spring:profiles:active: dev

这将使 Spring Boot 使用 application-dev.yml 中的配置。

Spring Boot 日志文件

看日志

Spring Boot 项目在启动时就有日志输出:

img

日志格式

img

输出自定义日志

  1. 得到日志对象
  2. 打印日志

例:

package com.example.demo;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {// 1.得到日志对象,注意是 slf4j 包里的,转入的参数表示日志来源于哪个类private static Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/hi")public String hi() {// 打印日志log.info("Hello");return null;}
}

结果:

img

将日志持久化

设置日志名称

#日志保存名称
logging:file:name: springboot.log

启动项目即可在项目根目录下面找到 springboot.log 文件,打开就能看到日志

特别注意:

  • 日志不会丢失,会一直追加
  • 当日志比较大的时候,会自动分割成多个文件

设置日志保存路径

也可以设置日志的路径:

logging:file:name: D:\Test\

启动项目,可以看到这个路径下自动生成了一个 spring.log 文件

设置日志级别 & 筛选日志

通过调用日志对象的不同方法输出不同级别的日志信息

log.trace("I am trace");
log.debug("I am debug");
log.info("I am info");
log.warn("I am warn");
log.error("I am error");

日志级别(从低到高)

  • trace:微量,少许的意思,级别最低
  • debug:调试信息
  • info:普通的打印信息
  • warn:警告,不影响使用,但需要注意的问题
  • error:错误,级别较高的错误日志信息
  • fatal:致命的,因为代码异常导致程序退出执行的事件

fatal 没有相应的方法来主动打印出来,fatal 级别的日志只有在程序发生严重错误的时候自动打印。


在之前的操作中,我们没有见过 debug 日志和 trace 日志,因为默认的日志级别是 info,trace 和 debug 日志都被筛选掉了。

在配置文件中设置 logging.level 配置项来筛选日志,输出指定日志级别以及比它级别高的日志信息,屏蔽比它级别低的日志。

logging.level.root 表示根日志,可以理解为所有的日志,默认值为 info。

如下配置,程序只会输出 debug 及级别更高的日志信息

logging:level:root: debug

更精细化的设置:

logging:level:root: warncom:example:demo: debug

以上配置表示,将日志输出的最低级别设置成 warn,而 com.example.demo 下的日志最低级别设置为 debug

更简单的日志输出——lombok

每个类都要 LoggerFactory.getLogger(xxx.class); 来获取日志对象太麻烦了,使用 lombok 可以实现更简单的输出。

使用 @Slf4j 注解,会自动给你提供一个名为 log 的日志对象

package com.example.demo;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class TestController {@RequestMapping("/hi")public String hi() {// 打印日志log.trace("I am trace");log.debug("I am debug");log.info("I am info");log.warn("I am warn");log.error("I am error");return null;}
}

Lombok 的常用注解

基本注解

注解作用
@Getter自动添加 Getter 方法
@Setter自动添加 Setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor自动添加必需属性的构造方法

组合注解

注解作用
@Data等效于 @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode

日志注解

注解作用
@Slf4j添加一个名为 log 的日志对象

相关文章:

Spring Boot 项目的创建、配置文件、日志

文章目录 Spring Boot 优点创建 Spring Boot 项目创建项目认识目录网页创建(了解) 约定大于配置Spring Boot 配置文件配置文件格式读取配置项properties 配置文件yml 配置文件基本语法进阶语法配置对象配置集合yml 设置不同环境的配置文件 Spring Boot 日…...

MySQL:drop、delete与truncate区别

一、用法不同 1、drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。 2、truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数…...

2024年顶级的9个 Android 数据恢复工具(免费和付费)

不同的事情可能会损坏您的Android手机并导致您丢失数据。但大多数时候,您可以使用取证工具恢复部分或全部文件。 问题可能来自手机的物理损坏、磁盘的逻辑故障、完整的系统擦除,或者只是简单的粗心大意。 但是,无论数据丢失的原因是什么&am…...

c# Aspose.Cells 导出Excel表格 使用随记

/// <summary>/// 导出Excel表格/// </summary>/// <param name"list">数据集合</param>/// <param name"header">数据表头</param>/// <param name"sumColumn">求和列</param>/// <param n…...

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…...

【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)

目录 前言阅读对象阅读导航前置知识笔记正文一、单体服务介绍二、服务拆分三、分布式微服务升级前的思考3.1 关于SpringBoot/SpringCloud的思考【有点门槛】 四、SpringCloud升级整合4.1 新建父子项目 学习总结感谢 前言 从本节课开始&#xff0c;我将自己手写一个基于SpringC…...

python安装与工具PyCharm

摘要&#xff1a; 周末闲来无事学习一下python&#xff01;不是你菜鸡&#xff0c;只不过是对手太强了&#xff01;所以你要不断努力&#xff0c;去追求更高的未来&#xff01;下面先了解python与环境的安装与工具的配置&#xff01; python安装&#xff1a; 官网 进入官网下载…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…...

iOS 防截屏方法(一)

利用UITextField的安全输入secureTextEntry来实现防截屏效果&#xff0c;上代码&#xff1a; // 将 textField 添加到父视图UITextField *textField [[UITextField alloc] init];textField.backgroundColor [UIColor whiteColor];textField.secureTextEntry YES;[self.view …...

【SpringBoot篇】5种类型参数传递json数据传参的操作

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…...

Mac系统升级node.js版本和npm版本

升级node.js版本 第一步&#xff1a;查询当前node.js版本 node -v 第二步&#xff1a;清除node.js的缓存 sudo npm cache clean -f 第三步&#xff1a;验证缓存是否清空 npm cache verify 第四步&#xff1a;安装n工具&#xff0c;n工具是专门用于管理node.js版本的工具…...

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…...

智能优化算法应用:基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MA…...

pymysql报错: unable to rollback、Already closed

参考&#xff1a; https://www.coder.work/article/4516746 https://www.cnblogs.com/leijiangtao/p/11882107.html https://stackoverflow.com/questions/55116007/pymysql-query-unable-to-rollback unable to rollback处理&#xff1a; # 关闭光标对象 cursor.close() # 关…...

[Linux] Web基础知识与http协议

一、HTML 1.1 HTML 的概念 HTML被称为超文本标记语言。 它是规范和标准. 它通过标记符号来标记网页中出现的各个部分。网页文件本身就是一种文本文件。 通过向文本文件添加标记&#xff0c;您可以告诉浏览器如何显示其中的内容。 HTML命令可以描述文本、图形、动画、声音、表格…...

2020年第九届数学建模国际赛小美赛B题血氧饱和度的变异性解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 B题 血氧饱和度的变异性 原题再现&#xff1a; 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间&#xff0c;我们希望能够使用模型描述血氧饱和度的模式。   我们有36名受试者的数据&#xff0c;每个受试者以1 Hz的频率连…...

【Flink on k8s】- 11 - 使用 Flink kubernetes operator 运行 Flink 作业

目录 1、创建本地镜像库 1.1 拉取私人仓库镜像 1.2 运行 1.3 本地浏览器访问 5000 端口...

【Linux】系统初识之冯诺依曼体系结构与操作系统

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冯诺依曼体系结构 2.操作…...

【PyTorch】模型训练过程优化分析

文章目录 1. 模型训练过程划分1.1. 定义过程1.1.1. 全局参数设置1.1.2. 模型定义 1.2. 数据集加载过程1.2.1. Dataset类&#xff1a;创建数据集1.2.2. Dataloader类&#xff1a;加载数据集 1.3. 训练循环 2. 模型训练过程优化的总体思路2.1. 提升数据从硬盘转移到CPU内存的效率…...

GO -- 设计模式

整篇文档参考了各大神对设计模式的总结&#xff0c;然后整理的一篇关于使用GO来实现设计模式的文档&#xff0c;如有问题&#xff0c;请批评指正&#xff01; 目录 设计模式的优点 设计模式的六大原则 设计模式&#xff0c;即Design Patterns&#xff0c;是指在软件设计…...

angular状态管理方案(ngrx)

完全基于redux的ngrx方案&#xff0c;我们看看在angular中如何实现。通过一个简单的计数器例子梳理下整个流程 一 安装 &#xff1a;npm i ngrx/store 这里特别要注意一点&#xff1a;安装 ngrx/store的时候会出现和angular版本不一致的问题 所以检查一下angular/core的版本…...

EPICS modbus 模块数字量读写练习

本文使用modbus slave软件模拟一个受控的modbus设备&#xff0c;此模拟设备提供如下功能&#xff1a; 1、线圈组1&#xff0c;8个线圈&#xff0c;起始地址为0&#xff0c;数量为8&#xff0c;软件设置如下(功能码1)&#xff0c;用于测试功能码5&#xff0c;一次写一个线圈&am…...

万界星空科技低代码平台:搭建MES系统的优势

低代码MES系统&#xff1a;制造业数字化转型的捷径 随着制造业的数字化转型&#xff0c;企业对生产管理系统的需求逐渐提高。传统的MES系统实施过程复杂、成本高昂&#xff0c;已经无法满足现代企业的快速发展需求。而低代码搭建MES系统的出现&#xff0c;为企业提供了一种高…...

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…...

五花八门客户问题(BUG) - 数据库索引损坏

问题 曾经有个客户问题&#xff0c;让我们开发不知所措了很久。简单点说就是客户的index周期性的损坏&#xff0c;即使全部重建后经历大约1~2周数据update后也会坏掉。导致的直接结果&#xff1a;select出来的数据不对。问题很严重。 直接看损坏的index文件看不出什么蛛丝马迹…...

mysql select count 非常慢

MySQL select count 性能分析 问题&#xff1a;mysql 在count时发现非常慢 select count(*) from xxx; 无论执行多少次&#xff0c;查询速度基本稳定在10-12秒之间 环境说明 windows11 x64SSD硬盘MySQL8.0.35数据库引擎为InnoDB数据行数不到3万行&#xff0c;但是数据量将近…...

Tomcat管理功能使用

前言 Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能&#xff0c;需要配置管理用户&#xff0c;即配置tomcat-users.xml文件。 &#xff01;&#xff01;&#xff01;注意&#xff1a;测试功…...

kyuubi整合flink yarn session mode

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catlogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 配置 ky…...

err_connect_length_mismatch错误

原因: 官网解释为&#xff1a;err_content_length_mismatch:错误的内容长度不匹配&#xff08;请求的Heather 里content-length长度与返回的content-length不一致&#xff09; 问题截图: 分析: 由截图可见,静态资源加载错误,提示err_content_length_mismatch,经排查,网络页签…...

dva的学习总结

公司的项目源码用的是react和dva&#xff0c;所以我必须抓紧时间学习一下dva了&#xff0c;一天时间&#xff0c;看看我学到了什么&#xff08;dva官网DvaJS&#xff09;[这是很久之前就打算写的了&#xff0c;一直没时间&#xff0c;一直存着草稿&#xff0c;今天发出来吧] 1…...