【Spring】SpringBoot 配置文件
文章目录
- 什么是配置文件
- SpringBoot配置文件
- 配置文件快速入手
- 配置文件的格式
- properties 配置文件说明
- properties 基本语法
- 读取配置文件信息
- properties 配置格式缺点
- yml 配置文件说明
- yml 基本语法
- 使用 yml 连接数据库
- yml 使用进阶
- yml 配置不同数据类型
- 配置对象
- 配置集合
- 配置Map
- 设置不同环境的配置文件
- YML优缺点
什么是配置文件
配置文件是一种文本文件,通常用于存储程序的参数和设置。它包含了程序运行所需的各种选项和配置信息,例如界面风格、服务器连接信息、默认语言等。这些信息可以通过键值对的形式表示,也可以使用特定的语法和结构描述更复杂的配置信息。
配置文件通常由程序在启动时读取和解析,以自定义程序的行为。例如,在网站开发中,网站的配置文件通常包含了数据库连接信息、安全性设置、日志记录等重要信息。在操作系统中,配置文件则可以用于指定各种系统参数,如网络连接、设备驱动程序等。
配置文件的格式和内容因程序而异,常见的配置文件格式包括INI文件、XML文件、JSON文件等。INI文件是最早的配置文件格式之一,它使用简单的键值对语法来存储配置信息。XML和JSON文件则更加灵活和可扩展,可以描述更复杂的配置信息。
除了使用传统的文本编辑器手动编写配置文件外,现在也有许多工具可以帮助用户轻松地编辑和管理配置文件。例如,一些应用程序具有自己的配置文件编辑器,用户可以通过界面来直观地编辑配置信息。另外,一些配置管理工具则可以帮助用户自动化地管理和维护配置文件,例如版本控制、备份和恢复等。
SpringBoot配置文件
SpringBoot⽀持并定义了配置⽂件的格式,也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的。
很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:
- 项目的启动端口
- 数据库的连接信息(包含用户名和密码的设置)
- 第三⽅系统的调⽤密钥等信息
- ⽤于发现和定位问题的普通⽇志和异常⽇志等
每个 Spring 项目都内置了一个 Tomcat 服务器,而 Tomcat 默认使用的端口是 8080,如果 8080 端口被占用或者多个 Spring 项目同时启动的话,就会出现某些程序无法正常启动的情况,所以这时候就可以使用 Spring 的配置文件修改启动的端口。
不仅如此,在日常生活中我们很多时候都会和数据库打交道,而每个人甚至一个人的不同机器上的数据库用户名、密码和 IP 地址都是有区别的,那么当这个项目交给别人的时候就需要在 Spring 配置文件中修改相关的配置。
不仅如此,一些公共的属性以及会根据情况而改变的属性都可以放在这个 Spring 配置文件中,通过使用 Spring 配置文件可以帮助我们解决很多的问题。
配置文件快速入手
我们先通过一个简单的例子来了解配置文件的作用。
我们创建 SpringBoot 项目的时候,会自动生成一个 application.properties
文件,这就是默认的 SpringBoot 配置文件,我们在这个配置文件中修改启动端口号看看结果。
server.port=9090
这里可以看到启动端口号修改成功了。
如果我们想要访问这个项目就不能使用 127.0.0.1:8080
了,而要使用 127.0.0.1:9090
地址了。
配置文件的格式
SpringBoot 的配置文件有三种形式:
- application.properties
- application.yml
- application.yaml
yml 是 yaml 的缩写,两个使用方式是相同的。并且这两个配置文件还是生活中使用频率最高的。
当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件,当然也可以使用 spring.config.name
指定文件路径和名称。
那么 properties 配置文件和 yml 配置文件有什么区别呢?区别主要体现在语法和使用场景上。properties 配置格式出现的比较早,而 yml 配置格式出现的则比较晚,并且在语法上,yml 配置格式相较于 properties 配置格式来说更加的简介,并且很重要的是:properties 配置文件中如果出现中文的话出现乱码的几率非常大,而 yml 配置格式则对中文的支持度是比较高的。存在两种配置格式,可以一定程度上降低程序员的学习成本。
- 理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置都会加载。如果配置⽂件内容有冲突,则以 .properties 为主,也就是 .properties 优先级更高
- 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)
properties 配置文件说明
properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项⽬默认的配置⽂件。
properties 基本语法
properties 配置格式是以键值对的形式存在的,key 和 value 之间通过“=”连接。并且 key 和 value 之间可以存在多个空格。
# 配置启动端口号
server.port=9090# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?charEncoding=utf8&userSSL=false
spring.datasource.name=root
spring.datasource.password=123456
配置文件中使用 #
添加注释信息。
读取配置文件信息
在项目中,如果想要主动读取配置文件中的信息的话,可以使用 @Value
注解来实现。
mykey=zhangsan
package com.example.springconfiguration;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("mykey")private String key;@RequestMapping("/getkey")public String getKey() {return "获取到key:" + key;}
}
这是为什么呢?我们的 mykey 不是 zhangsan 吗?为什么获取到的是 mykey 呢?
这是因为 Spring 将@Value
中的 “mykey” 当作了 value 赋值给了 key,那么我们该如何才能获取到 key mykey 中的 value 值呢?
要想获取到 @Value
key 中的 value 值,需要使用 ${}
来获取到这里面的 key 的 value 值。
@Value("${mykey}")
properties 配置格式缺点
为什么说 properties 配置格式对中文不是很友好呢?我们来看看:
mykey=张三
为什么就肯定说是 properties 配置文件的问题而不是我们前端接收到响应之后出现的问题呢?我们打断点看看。
这里我们读取到 mykey 的时候就是乱码,而是我的 idea 也是默认是 UTF-8 格式,是支持中文的,所以说 properties 配置文件中尽量不要出现中文。
不仅如此,通过观察 properties 配置文件中的信息,我们会发现里面的内容是比较冗余的。
以上只是 properties 的两个显著的缺点。
yml 配置文件说明
yml 是 YAML 的缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔。光看 yml 的翻译就可以看出来 yml 的理想是非常远的“语言”。我们先来看看 yml 配置文件的基本语法。
yml 基本语法
yml 配置文件对于语法要求是非常严格的,他虽然也是以键值对的形式存在的,但是 key 和 value 之间必须以 冒号 + 空格 相连接,这个空格是不能省略的。
如果配置成功,那么属性就会有高亮提示。
这种灰色,就说明该属性没有配置成功,也就是语法存在问题。
空格可以有多个。
使用 yml 连接数据库
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&userSSL=falseusername: rootpassword: 123456
这种 yml 配置方式显示出了层级关系并且节省了很多代码:url、username和password属性属于datasource,而 datasource 则属于 spring。
yml 使用进阶
yml 的使用不止有这些,还有其他更厉害的用法。
yml 配置不同数据类型
前面 properties 配置格式差不多所有的配置都是字符串类型,而在 yml 配置格式中还存在布尔类型、整数类型、浮点数类型以及Null类型。
# 字符串
string.value: hello# 布尔类型
boolean.value: true
boolean.value1: false# 整数类型
int.value: 10# 浮点数
float.value: 3.14159# Null ~ 代表null
null.value: ~
那么 yml 配置文件的属性如何读取呢?这些基本的数据类型是和 properties 配置格式是一样的,都是使用 @Value
注解来获取到指定的配置。
package com.example.springconfiguration;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("${string.value}")private String stringValue;@Value("${boolean.value}")private boolean flg1;@Value("${boolean.value1}")private boolean flg2;@Value("${int.value}")private int intValue;@Value("${float.value}")private float floatValue;@Value("${null.value}")private String nullValue;@RequestMapping("/getkey")public String getKey() {return stringValue + " | " + flg1 + " | " + flg2 + " | "+ intValue + " | " + floatValue + " | " + nullValue;}
}
值得注意的是,在 yml 配置格式中,字符串的表现形式有三种,一种是不加引号、一种是加单引号、还有一种就是加双引号,与 properties 配置格式不同,因为 properties 配置格式都是字符串类型,所以从等号后面的第一个非空格字符开始就会被当成是字符串。
properties 配置格式
mykey1=abcde
mykey2='abcde'
mykey3="abcde"
@RestController
public class PropertiesController {@Value("${mykey1}")private String mykey1;@Value("${mykey2}")private String mykey2;@Value("${mykey3}")private String mykey3;@RequestMapping("/getkey")public String getKey() {return mykey1 + " | " + mykey2 + " | " + mykey3;}
}
yml 配置格式
string1: abcde
string2: 'abcde'
string3: "abced"
@RestController
public class YmlController {@Value("${string1}")private String string1;@Value("${string2}")private String string2;@Value("${string3}")private String string3;@RequestMapping("/getymlkey")public String getKey() {return string1 + " | " + string2 + " | " + string3;}
}
根据输出的内容可以看到,yml 中表示字符串的方式有三种,但是这三种方式又有一些区别。
string1: abc \n de
string2: 'abc \n de'
string3: "abc \n ed"
@RestController
public class YmlController {@Value("${string1}")private String string1;@Value("${string2}")private String string2;@Value("${string3}")private String string3;@RequestMapping("/getymlkey")public String getKey() {System.out.println(string1);System.out.println(string2);System.out.println(string3);return string1 + " | " + string2 + " | " + string3;}
}
可以看到没有引号和单引号的用法基本上是一样的,但是双引号就会有区别,没有引号和单引号会将字符串中的一些特殊符号进行转义,使之呈现出跟字符串里面一样的内容,而双引号则不会进行转义。
配置对象
yml 中不仅能配置一些基本的数据类型,还可以配置对象。啊?我没听错吧?yml 配置格式还能配置对象?没错,你没听错,我们 yml 就是这么厉害。那么在 yml 中如何配置对象呢?
student:id: 123name: zhangsanage: 18
类似上面的配置格式就是 yml 配置对象,当然也可以使用行内写法(跟上面的写法作用是一致的)。
student1: {id: 234, name: lisi, age: 20}
那么如何取出配置的对象呢?这时候就不能使用 @Value
注解了,需要使用 ConfigurationProperties
注解,并且取出也需要借助类来读取。
package com.example.springconfiguration;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {private int id;private String name;private int age;
}
仅仅只是通过类来读取也是不行的,还需要保证类中的属性名称和 yml 配置文件中的对象的属性名称一致,并且类中为这些属性提供了 getter 和 setter 方法。
这是 ConfigurationProperties
注解的参数,如果不指定参数的名称的话,默认就是value/prefix。
package com.example.springconfiguration;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;@RestController
public class StudentController {@Autowiredprivate Student student;@RequestMapping("/readStudent")public String readStudent() {return student.toString();}
}
配置集合
yml 配置文件还可以配置集合。
dbtypes:name:- mysql- sqlserver- db2
读取 yml 配置文件中的集合同样是依赖 ConfigurationProperties
注解和类以及类中的 getter 和 setter 方法。
package com.example.springconfiguration;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class ListConfig {private List<String> name;
}
package com.example.springconfiguration;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ListController {@Autowiredprivate ListConfig listConfig;@RequestMapping("/readList")public String readList() {return listConfig.toString();}
}
配置Map
yml 配置格式还可以配置 Map 类型的属性。
maptypes:map:k1: Chinak2: Americak3: Japanese
行内写法:
maptypes2: {map: {k1: China, k2: America, k3: Japanese}}
读取 Map 类型配置也是依赖 ConfigurationProperties
注解和类以及类中的 getter 和 setter 方法。
package com.example.springconfiguration;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Map;@Component
@ConfigurationProperties(prefix = "maptypes")
@Data
public class MapConfig {private Map<String, String> map;
}
package com.example.springconfiguration;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MapController {@Autowiredprivate MapConfig mapConfig;@RequestMapping("/readMap")public String readMap() {return mapConfig.toString();}
}
设置不同环境的配置文件
有可能我们一个项目中针对不同的情况会有不同的配置,那么我们是否要每到一个新环境就将另一个配置文件中的内容复制到当前使用的配置文件中吗?其实没必要,一个 Spring 项目中允许存在多个配置文件,并且我们可以指定使用哪个配置文件。
但是需要注意的是,spring 中的配置文件必须以 application-xxx.yml
格式命名。比如 application-dev.yml
和 application-prod.yml
,如果需要切换的话,只需要在 application.yml
配置文件中加入
spring:profiles:active: dev # application-xxx.yml 这里填 - 后面的字符
假设我们这里使用 application-dev.yml
配置文件。
YML优缺点
优点:
- 易读性强:YAML采用缩进和符号的方式表示层次结构,使得配置文件易于阅读和理解。
- 数据结构丰富:YAML支持多种数据结构类型,如标量、数组、映射等,可以方便地表示各种数据结构。
- 支持多语言:YAML的语法简洁,易于学习,支持多种编程语言进行解析和读取。
缺点:
- 错误易引入:由于YAML的缩进规则严格,如果缩进不一致或者符号使用不当,会导致解析错误。
- 安全性问题:由于YAML易于阅读和编写,可能存在被篡改的风险。在安全敏感的应用中,需要采取额外的安全措施。
- 依赖外部库:在某些编程语言中,需要依赖特定的第三方库才能解析和读取YAML文件。这可能会增加开发者的负担。
相关文章:

【Spring】SpringBoot 配置文件
文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…...

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享
作者:索增增(小红书)、宋泽辉(小红书)、张佐玮(阿里云) 背景介绍 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,目前已经支持了 K8s…...

网游逆向分析与插件开发-游戏反调试功能的实现-项目需求与需求拆解
上一个专栏结束位置:网游逆向分析与插件开发-代码保护壳的优化-修改随机基址为固定基址-CSDN博客 上一个专栏是做了一个壳有了一定的保护,但是保护还是不够,最大的保护是根上把问题解决了,就是我不允许你对我进行调试,…...

阶段七-GitEE
Git:版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…...

Redis小记(1)
目录 1.Redis和Mysql的区别 2.Redis常用命令 1.Redis和Mysql的区别 a:mysql和redis的存储方式不同 mysql是关系型数据库,用表来进行存储数据。 redis是通过键值对来存储数据,key使用string来标识,value可以是各种不同的数据结构。 b:mys…...

Flutter windows 环境配置
Flutter windows 环境配置 从零开始,演示flutter环境配置到启动项目,同时支持 vscode 和 android studio 目录 Flutter windows 环境配置一、环境配置1. Flutter SDK2. Android Studio3. JDK4. 拓展安装5. Visual Studio 2022二、项目创建和启动1. vsco…...

odoo17核心概念view5——ir_ui_view.py
这是view系列的第5篇文章,介绍一下view对应的后端文件ir_ui_view.py,它是base模块下的一个文件 位置:odoo\addons\base\models\ir_ui_view.py 该文件一共定义了三个模型 1.1 ir.ui.view.custom 查询数据库这个表是空的,从名字看…...

截断整型提升算数转换
文章目录 🚀前言🚀截断🚀整型提升✈️整型提升是怎样的 🚀算术转换 🚀前言 大家好啊!这里阿辉补一下前面操作符遗漏的地方——截断、整型提升和算数转换 看这一篇要先会前面阿辉讲的数据的存储否则可能看不…...

阿里云 ECS Docker、Docker Compose安装
https://help.aliyun.com/document_detail/51853.html https://docs.docker.com/compose/install/ Centos https://blog.csdn.net/Alen_xiaoxin/article/details/104850553 systemctl enable dockerdocker-compose安装 https://blog.csdn.net/qq465084127/article/details/…...

LeetCode——1276. 不浪费原料的汉堡制作方案
通过万岁!!! 题目,给你两个数tomatoSlices和cheeseSlices,然后每制作一个巨无霸汉堡则消耗4个tomatoSlices和1和cheeseSlices,每制作一个小皇堡则需要消耗2个tomatoSlices和1和cheeseSlices。问给你这两个…...

隆道吴树贵:生成式人工智能在招标采购中的应用
12月22日,由中国招标投标协会主办的招标采购数字发展大会在北京召开,北京隆道网络科技有限公司总裁吴树贵受邀出席大会,并在“招标采购数字化交易创新成果”专题会议上发言,探讨生成式人工智能如何在招标采购业务中落地应用。 本次…...

docker搭建kali及安装oneforall
前期docker的安装这里就不用多说了,直接看后面的代码 安装oneforall 1.安装git和pip3 sudo apt update sudo apt install git python3-pip -y2.克隆项目 git clone https://gitee.com/shmilylty/OneForAll.git3.安装相关依赖 cd OneForAll/ sudo apt install pyt…...

【MySQL】数据库之事务
目录 一、什么是事务 二、事务的ACID是什么? 三、有哪些典型的不一致性问题? 第一种:脏读 第二种:不可重复读 第三种:幻读 第四种:丢失更新 四、隔离级别有哪些? (1…...

AGV|RGV小车RFID传感器CNS-RFID-01/1S的RS232通讯联机方法
CNS-RFID-01/1S广泛应用于AGV小车,搬运机器人,无人叉车等领域,用于定位,驻车等应用,可通过多种通讯方式进行读写操作,支持上位机控制,支持伺服电机,PLC等控制设备联机,本…...

【Python可视化系列】一文教会你绘制美观的热力图(理论+源码)
一、问题 前文相关回顾: 【Python可视化系列】一文彻底教会你绘制美观的折线图(理论源码) 【Python可视化系列】一文教会你绘制美观的柱状图(理论源码) 【Python可视化系列】一文教会你绘制美观的直方图(理…...

百度Apollo五步入门自动驾驶:Dreamview与离线数据包分析(文末赠送apollo周边)
🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式:通过连接报名观看课程,即可免费获取精美周边 ⛳️活动链接…...

为什么IPv6 可以作为低功耗蓝牙的物联网体系结构?
蓝牙40规范引人了低功耗蓝牙(Bluetooth Low Energy,BLE)技术。低牙是一种低能低延成本的无线通信技术。 与传统蓝牙相比,低功耗蓝牙同样使用24GHz频段,但其将信道重新划分为 40个,包含37 个数据信道和3个广播信道(传统蓝牙共使用 79 个信道)低功蓝牙的协…...

GPT每预测一个token就要调用一次模型
问题:下图调用了多少次模型? 不久以前我以为是调用一次 通过看代码是输出多少个token就调用多少次,如图所示: 我理解为分类模型 预测下一个token可以理解为分类模型,类别是vocab的所有token,每一次调用都…...

运维工程师的出路到底在哪里?
1.35岁被称为运维半衰期,主要是因为运维工作的技术栈和工作方式在不断更新和演进。随着新技术的出现和发展,老旧的技术逐渐被淘汰,运维工作也需要不断学习和适应新技术,否则就容易被市场淘汰。 2.要顺利过渡半衰期,运…...

2312clang,基于访问者的前端动作
原文 基于RecursiveASTVisitor的ASTFrontendActions. 创建用RecursiveASTVisitor查找特定名字的CXXRecordDeclAST节点的FrontendAction. 创建FrontendAction 编写基于clang的工具(如Clang插件或基于LibTooling的独立工具)时,常见入口是允许在编译过程中执行用户特定操作的F…...

怎么搭建实时渲染云传输服务器
实时渲染云传输技术方案,在数字孪生、虚拟仿真领域使用越来越多,可能很多想使用该技术方案项目还不知道具体该怎么搭建云传输服务器,具体怎么使用实时云渲染平台系统。点量云小芹将对这两个问题做集中分享。 一、实时渲染服务器怎么搭建&…...

如何在生产环境正确使用Redis
一、在生产环境使用Redis 如果在生产环境使用Redis,需要遵守一定的使用规范,以保障服务稳定、高效。。 1.1、明确Redis集群的服务定位 1、仅适用于缓存场景:Redis定位于高性能缓存服务,强调快速读写和低延迟的特性,…...

LeetCode-环形链表问题
1.环形链表(141) 题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统…...

C# 读取Word表格到DataSet
目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 核心代码 杀掉进程 总结 功能需求 在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存…...

构建外卖系统:从技术到实战
在当今高度数字化的社会中,外卖系统的开发变得愈发重要。本文将从技术角度出发,带领读者一步步构建一个基础的外卖系统,并涵盖关键技术和实际代码。 1. 技术选型 1.1 后端开发 选择Node.js和Express框架进行后端开发,搭建一个灵…...

城市之眼:数据可视化在智慧城市的角色
作为智慧城市建设的核心组成部分,数据可视化扮演着至关重要的角色。在城市中,数据源源不断地产生,涵盖了从交通流量、环境质量到市民需求等各个方面。而数据可视化作为将这些数据呈现出来的手段,对智慧城市的发展起着关键性的作用…...

Nature | Baker团队用AI设计出史上最高互作强度的蛋白质
蛋白质是生命的基础,是生命功能的主要执行者,其结构与功能由氨基酸序列所决定。蛋白质设计是指对新蛋白质分子进行人为的合理设计,旨在设计新的活性,行为或目的,并增进对蛋白质功能的基本了解。可以从头开始设计蛋白质…...

C# 初识System.IO.Pipelines
写在前面 在进一步了解Socket粘包分包的过程中,了解到了.NET 中的 System.IO.Pipelines,可以更优雅高效的解决这个问题;先跟随官方的示例做个初步的认识。 System.IO.Pipelines 是一个库,旨在使在 .NET 中执行高性能 I/O 更加容…...

嵌入式——RTC内置实时时钟
学习目标 理解原理图RTC设计部分掌握初始化RTC掌握设置时间掌握读取时间学习内容 RTC原理图 RTC结构框图 RTC时钟 开发流程 加载依赖。gd32f4xx_rtc.c,gd32f4xx_pmu.c初始化RTC。时钟配置。获取时钟。RTC初始化 // 电池管理加载 rcu_periph_clock_enable(RCU_PMU); pmu_back…...

nodejs微信小程序+python+PHP的热带野生动物园景点预约订票系统的设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...