【JavaEE进阶】Spring Boot配置文件

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗

如有错误,欢迎指出~

目录

SpringBoot配置⽂件

举例: 通过配置文件修改端口号

配置⽂件的格式

properties基本语法

读取配置⽂件

 properties配置文件的缺点

yml配置⽂件

yml基本语法

yml和properties连接数据库的配置对⽐

yml的使用 

yml配置读取

配置对象

读取yml配置文件中的对象 

配置集合

读取yml配置文件中的集合 

配置Map

​编辑 yml优缺点

验证码案例

需求

约定前后端交互接⼝

接⼝定义

1. ⽣成验证码

2. 校验验证码是否正确

Hutool⼯具介绍

yml文件配置项

验证码配置项对应的Java对象  

后端代码实现

前端代码实现

index.html

success.html

 测试

总结 



配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启 动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏.

硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中,也就是我们常说的"代码写死"

使⽤配置⽂件,可以使程序完成⽤⼾和应⽤程序的交互,或者应⽤程序与其他应⽤程序的交互

SpringBoot配置⽂件

SpringBoot⽀持并定义了配置⽂件的格式,也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的 ⽬的.

很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:

• 项⽬的启动端⼝

• 数据库的连接信息(包含⽤⼾名和密码的设置)

• 第三⽅系统的调⽤密钥等信息

• ⽤于发现和定位问题的普通⽇志和异常⽇志等.

举例: 通过配置文件修改端口号

Tocmat默认端⼝号是8080,所以我们程序访问时的端⼝号也是8080 但是如果8080端⼝号已经被其他进程使⽤,我们可以通过配置⽂件来修改服务的端⼝号 SpringBoot在创建项⽬时,就已经帮我们创建了配置⽂件

修改 application.properties ⽂件  加上server.port=9090

配置⽂件的格式

SpringBoot配置⽂件有以下三种:

  1. application.properties
  2. application.yml
  3. application.yaml

yml为yaml的简写,实际开发中出现频率最⾼.yaml和yml的使⽤⽅式⼀样,当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载 application.properties 和application.yaml 或者application.yml ⽂件.

  1. 理论上讲.properties 和.yml 可以并存在于⼀个项⽬中,当.properties 和.yml 并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以.properties 为主,也就是 .properties 优先级更⾼.(properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件 )
  2. 虽然理论上来讲.properties 可以和.yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).

properties基本语法

properties是以键值的形式配置的,key和value之间是以"="连接的,如: # 配置项⽬端⼝号 server.port=8080

配置⽂件中使⽤“#”来添加注释信息。

读取配置⽂件

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤@Value 注解来实现。 @Value 注解使⽤" ${} "的格式读取,如下代码所⽰:

properties配置如下:

m.k=do
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
//@RequestMapping("/p1")
public class PropertiesController {@Value("${m.k}")private String k;@RequestMapping("/v1")public String key(String input){//参数名 input 与成员变量 k 同名,否则可能会读取失败System.out.println("注入后的key值为: " + k);if (k == null) {System.out.println("key的值为null");}return "读取到properties文件中的k的值: "+ k;}
}

 properties配置文件的缺点

properties配置⽂件中会有很多的冗余的信息,⽐如

yml配置文件可以解决以上问题 

yml配置⽂件

yml是YAML是缩写,它的全称YetAnotherMarkupLanguage翻译成中⽂就是“另⼀种标记语⾔.

yml基本语法

yml是树形结构的配置⽂件,它的基础语法是"key:value". key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略

正确配置 会有高亮提示

yml和properties连接数据库的配置对⽐

yml的使用 

# 字符串 
string.value: Hello
# 布尔值,true或false 
boolean.value: true
boolean.value1: false
# 整数 
int.value: 10
# 浮点数 
float.value: 3.14159
# Null,~代表null 
null.value: ~
# "" 空字符串 
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来 
empty.value: ''

yml配置读取

yml读取配置的⽅式和properties相同,使⽤@Value注解即可,实现代码如下:

    @Value("${code.java}")private String java;@RequestMapping("/v2")public String v2(){return "读取yml配置文件code.java的值: "+ java;}

注意事项:value值加单双引号 字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。

尝试在application.yml中配置如下信息:

String:str1: hello \n ymlstr2: 'hello \n yml'str3: "hello \n yml"
    @RequestMapping("/v3")public String v3(){System.out.println(str1);System.out.println(str2);System.out.println(str3);return "yml";}

 从上述结果可以看出:

  • • 字符串默认不⽤加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串.
  • 双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义.

配置对象

我们还可以在yml中配置对象,如下配置:以下两者写法都行

Student:id: 1name: zhangsanage: 21
Student2: {id: 2, name: lisi, age: 18}
读取yml配置文件中的对象 

这个时候就不能⽤@Value来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties (prefix = "对应的是配置文件中的对象")来读取,具体实现如下: 

package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "student")//注意对象名称
@Data
@Component
public class Student {public int id;public String name;public int age;
}
    @Autowiredprivate Student student;@RequestMapping("/v4")public String v4(){return student.toString();}

配置集合

2022:name:- zhangsan- lisi- wangwu
读取yml配置文件中的集合 

集合的读取和对象⼀样,也是使⽤@ConfigurationProperties 来读取的,具体实现如下:  

package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@Component
@ConfigurationProperties(prefix = "2022")
public class List2020 {private List<String> name;
}
    @Autowiredprivate List2020 list2020;@RequestMapping("/v5")public String v5(){return list2020.toString();}

配置Map

配置⽂件也可以配置map,如下所⽰

maptypes:map:k1: 111k2: 222k3: 333

行内写法作用相同

maptypes2: {map2: {k1: 1, k2: 2, k3: 3}}

 Map的读取和对象⼀样,也是使⽤@ConfigurationProperties 来读取的,具体实现如下:

package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.HashMap;@Data
@Component
@ConfigurationProperties(prefix = "maptypes")
public class MapTypes {public HashMap<String, String> map;
}
    @Autowiredprivate MapTypes mapTypes;@RequestMapping("/v6")public String v6(){return mapTypes.toString();}

 yml优缺点

优点:

1. 可读性⾼,写法简单,易于理解

2. ⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.

3. ⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤

缺点:

1. 不适合写复杂的配置⽂件

转换的过程也⽐较花费精⼒,如果配置更复杂⼀点,可读性会更差,代码也会更难写

2. 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案)

验证码案例

验证码的实现⽅式很多,可以前端实现,也可以后端实现.⽹上也有⽐较多的插件或者⼯具包可以使⽤, 咱们选择使⽤Hutool提供的⼩⼯具来实现

需求

界⾯如下图所⽰

1. ⻚⾯⽣成验证码

2. 输⼊验证码,点击提交,验证⽤⼾输⼊验证码是否正确,正确则进⾏⻚⾯跳转

约定前后端交互接⼝

需求分析 后端需要提供两个服务

1. ⽣成验证码,并返回验证码

2. 校验验证码是否正确:校验验证码是否正确.

接⼝定义

1. ⽣成验证码

请求: 请求URL: /captcha/getCaptcha

响应:验证码图⽚内容

浏览器给服务器发送⼀个 /captcha/getCaptcha 这样的请求,服务器返回⼀个图⽚,浏览器显 ⽰在⻚⾯上

2. 校验验证码是否正确

请求:/captcha/check 请求URL: /captcha/check 请求参数: captcha=xn8d

captcha:⽤⼾输⼊的验证码

响应: true 根据⽤⼾输⼊的验证码,校验验证码是否正确.

true:验证成功.false:验证失败. 

Hutool⼯具介绍

这里验证码的实现,使⽤Hutool提供的⼩⼯具来实现 Hutool是⼀个Java⼯具包类库,对⽂件、流、加密解密、转码、正则、线程、XML等JDK⽅法进⾏封 装,组成各种Util⼯具类. Hutool是⼀个⼩⽽全的Java⼯具类库,通过静态⽅法封装,降低相关API的学习成本,提⾼⼯作效 率,使Java拥有函数式语⾔般的优雅,让Java语⾔也可以"甜甜的".

引入依赖

<dependency> <groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.22</version>
</dependency>

1.获取和验证验证码

package com.example.demo.captcha;import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@RequestMapping("/captcha")
@RestController
public class HuToolCaptchaController {@GetMapping("/getCaptcha")public void getCaptcha(HttpServletResponse response, HttpSession session){//定义图形验证码的长和宽LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(100, 40, 4, 150);String code = lineCaptcha.getCode();//存储sessionsession.setAttribute("CAPTCHA_KEY",code);//获取当前时间, 验证码的时效性session.setAttribute("CAPTCHA_Date",new Date());//验证码写出,可以写到文件,也可以写到流里try {lineCaptcha.write(response.getOutputStream());//输出System.out.println("生成的验证码: "+ lineCaptcha.getCode());} catch (IOException e) {throw new RuntimeException(e);}}@RequestMapping("/check")public boolean check(HttpSession session, String captcha){//captcha为空,直接返回false;if(!StringUtils.hasLength(captcha)){return false;}String code = (String) session.getAttribute("CAPTCHA_KEY");return captcha.equals(code);}
}

对程序进⾏调整

1)把配置项挪到配置⽂件中

2)把⽣成的验证码存储在Session中,校验时使⽤ 

yml文件配置项

captcha:height: 40width: 100session:key: CAPTCHA_SESSION_KEYdate: KAPTCHA_SESSION_DATE

验证码配置项对应的Java对象  

package com.example.demo.captcha;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;@Data
@Configuration
@ConfigurationProperties(prefix = "captcha")
public class Captcha {private Integer width;private Integer height;private Session session;@Datapublic static class Session{//要使用公开的 静态内部类,// 否则session拿不到值(要先有外部类的对象,然后才能拿到内部类,静态内部类就不用), 或者不要写内部类private String date;private String key;}
}

后端代码实现

package com.example.demo.captcha;import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.Date;@RequestMapping("/captcha")
@RestController
public class HuToolCaptchaController {//注入配置文件对应对象@Autowiredprivate Captcha captcha;//过期时间1分钟 = 60秒 * 1000毫秒private static long VALID_TIME_OUT  = 60 * 1000;@GetMapping("/getCaptcha")public void getCaptcha(HttpServletResponse response, HttpSession session){//定义图形验证码的长和宽LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captcha.getWidth(), captcha.getHeight());String code = lineCaptcha.getCode();//存储sessionsession.setAttribute(captcha.getSession().getKey(),code);//当前时间session.setAttribute(captcha.getSession().getDate(),new Date());//验证码写出,可以写到文件,也可以写到流里try {lineCaptcha.write(response.getOutputStream());response.setContentType("image/jpeg");response.setCharacterEncoding("utf-8");//防止缓存response.setHeader("Pragma", "No-cache");//输出System.out.println("生成的验证码: "+ lineCaptcha.getCode());} catch (IOException e) {throw new RuntimeException(e);}}@RequestMapping("/check")public boolean check(HttpSession session, String captcha1){System.out.println("用户输入验证码: "+ captcha1);//captcha为空,直接返回false;if(!StringUtils.hasLength(captcha1)){return false;}String code = (String) session.getAttribute(captcha.getSession().getKey());Date date = (Date) session.getAttribute(captcha.getSession().getDate());if(date == null || (System.currentTimeMillis() - date.getTime()) > VALID_TIME_OUT){return false;}//验证码不区分大小写验证验证码是否正确return captcha1.equalsIgnoreCase(code);}
}

前端代码实现

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>验证码</title><style>#inputCaptcha {height: 30px;vertical-align: middle; }#verificationCodeImg{vertical-align: middle; }#checkCaptcha{height: 40px;width: 100px;}</style>
</head><body><h1>输入验证码</h1><div id="confirm"><input type="text" name="inputCaptcha" id="inputCaptcha"><img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?换一张" /><input type="button" value="提交" id="checkCaptcha"></div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$("#verificationCodeImg").click(function(){$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({type: "post",url: "/captcha/check",data: {captcha1: $("#inputCaptcha").val()},success: function(result){if(result){location.href = "success.html"}else{alert("验证码错误");}}});});</script>
</body></html>

success.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证成功页</title>
</head>
<body><h1>验证成功</h1>
</body>
</html>

 测试

总结 

  1. properties是以key=value的形式配置的键值类型的配置⽂件,yml使⽤的是树形配置⽅式.
  2. 读取配置⽂件内容,使⽤@Value 注解,注解内使⽤" ${} "的格式读取.
  3. yml层级之间使⽤换⾏缩进的⽅式配置,key和value之间使⽤":"(英⽂冒号)加空格的⽅式设置,并 且空格不可省略.
  4. properties为早期并且默认的配置⽂件格式,其配置存在⼀定的冗余数据,使⽤yml可以很好的解决 数据冗余的问题,但不适合复杂配置
  5. yml可以和properties共存,但⼀个项⽬中建议使⽤⼀种配置类型⽂件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23555.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker内存芭蕾:优雅调整容器内存的极限艺术

title: “&#x1f4be; Docker内存芭蕾&#xff1a;优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “&#x1fa70;&#x1f4a5;&#x1f4ca;” 当你的容器变成内存吸血鬼时… &#x1f680; 完美内存编排示范 &#x1f4dc; 智能内存管家脚本…

【Godot4.3】题目与答案解析合并器

免责申明 本文和工具截图中涉及题库和题目&#xff0c;均为本人自学使用&#xff0c;并未有商业和传播企图。如有侵害&#xff0c;联系删改。 概述 笔者本人医学专业从业人员&#xff0c;编程只是业余爱好。在自己的专业应考学习过程当中&#xff1a; 有时候不太喜欢纸质题库…

学习笔记-250222

论文&#xff1a; Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力&#xff0c;当提示输入目标类别时&#xff0c;llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …

从图片生成3维场景--NERF原理解析及加速版HashNeRF-pytorch代码实现

概要 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种基于神经网络的三维图像生成技术&#xff0c;通过一组从不同角度拍摄的2D图片&#xff0c;生成一个3D场景&#xff0c;并且能够渲染出该场景在任意视角下的图像。这项技术的核心思想是利用神经网络的强大建模能…

PHP-综合4

[题目信息]&#xff1a; 题目名称题目难度PHP-综合42 [题目考点]&#xff1a; PHP综合训练[Flag格式]: SangFor{Ouk3i63BuShgxqdRcn_9kMNqKFDe5j4f}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 http://分配ip:2087[题目writeup]&#xff1a;…

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天&#xff0c;高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具&#xff0c;需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能&#xff0c;成为智能手机中不可或缺的精密时钟源&#xff0c;为通信、…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

【AI】模型量化--模型量化技术基础

1. 背景 对于接触过AI模型的人来说,经常会听说一个词语模型量化,那什么是模型量化?为什么需要模型量化?有哪些常用的模型量化技术呢?本文将一一展开叙述。 2. 概念 模型量化是一种在深度学习和机器学习领域中广泛应用的技术,旨在通过减少模型中数据的表示精度来降低模…

力扣(leetcode)每日一题 1656 设计有序流

1656. 设计有序流 - 力扣&#xff08;LeetCode&#xff09; 题目 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) …

【附源码】基于opencv+pyqt5搭建的人脸识别系统

文章目录 前言一、人脸检测二、人脸识别1.训练识别器2.识别人脸 三、界面相关1.Qlabel展示图片2.表格跟随内容而增加和减少3.选择图片文件4.警告框 四、源码获取总结 前言 人脸识别技术作为人工智能领域的一颗璀璨明珠&#xff0c;正逐渐渗透到我们生活的每一个角落&#xff0…

【一起学Rust | 框架篇 | Tauri2.0框架】在Tauri应用中设置Http头(Headers)

文章目录 前言一、配置准备1. 检查版本2. 使用条件3. 支持的请求头&#xff08;并不是全部支持&#xff09; 二、使用步骤1. 如何配置header2. 框架集成1. 对于Vite系列、Nuxt、Next.js这种前端框架Vite系列框架Angular系列框架Nuxt系列框架Next.js系列框架 2. 对于Yew和Leptos…

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

SeaCMS V9海洋影视管理系统报错注入

漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式&#xff0c;攻击者可以利用该漏洞访问或操作数据库&#xff0c;造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中&#xff0c;用户输入&#xff08;如登录、评论、分页、ID 等&a…

Upload-labs

pass-01 先随便上传一个php文件&#xff0c;但提示发现使用了js对不法文件进行了检查&#xff0c;是前端验证 上传php代码<?php phpinfo();?> ,使用bp抓包 将后缀名改为php然后放行 复制图片链接访问&#xff0c;得到有关php的所有信息 Pass-02 根据提示可以知道&…

算法回顾1

class Solution {public int removeElement(int[] nums, int val) {int fast 0;int slow 0;for (fast 0; fast < nums.length; fast) {if (nums[fast] ! val) {nums[slow] nums[fast];slow;}}return slow;} } 用双指针写这道题&#xff0c;快慢指针初始值都为0&#xf…

智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新

智能交通系统&#xff08;Intelligent Transportation Systems, ITS&#xff09;是利用先进的信息技术、通信技术、传感技术、计算机技术以及自动化技术等&#xff0c;来提升交通系统效率和安全性的一种交通管理方式。ITS通过收集和分析交通数据&#xff0c;智能化地调度、控制…

LangChain 由入门到精通

LangChain 由入门到精通 作者&#xff1a;王珂 邮箱&#xff1a;49186456qq.com 文章目录 LangChain 由入门到精通简介一、LangChain环境搭建1.1 集成大模型提供商1.1.1 集成Ollama 1.2 LangChain安装 二、LangChain开发2.1 提示词工程2.2 示例集 三、LangChain LCEL 工作流编…

使用S32DS部署Tensorflow lite到S32K3

一、概述 1、本文主要介绍如何用S32DS在NXP S32K344 中部署Tensorflow&#xff1b; 2、示例使用了Tensorflow入门代码&#xff0c;主要功能是识别28 * 28 的手写图片的数字&#xff1b; 3、在MCU上开启DSP功能后&#xff0c;最终运行时间在 7ms&#xff08;64神经元&#xf…

【OMCI实践】ONT上线过程的omci消息(五)

引言 在前四篇文章中&#xff0c;主要介绍了ONT上线过程的OMCI交互的第一、二、三个阶段omci消息&#xff0c;本篇介绍第四个阶段&#xff0c;OLT下发配置到ONT。前三个阶段&#xff0c;每个厂商OLT和ONT都遵循相同标准&#xff0c;OMCI的交换过程大同小异。但第四个阶段&…