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

SpringBoot学习笔记(二)配置文件

1、配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的;

  • application.properties

  • application.yml

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

YAML:以数据为中心,比json、xml等更适合做配置文件。

2、YMAL语法

  • key: value;kv之间有空格

  • 大小写敏感

  • 使用缩进表示层级关系

  • 缩进不允许使用tab,只允许空格

  • 缩进的空格数不重要,只要相同层级的元素左对齐即可

  • '#'表示注释

  • 字符串无需加引号,如果要加,例如:单引号会将 \n 作为字符串输出,双引号会将 \n 作为换行输出

3、数据类型

字面量:单个的、不可再分的值。date、boolean、string、number、null

k: v

对象:键值对的集合。map、hash、set、object

#行内写法:  
k: {k1:v1,k2:v2,k3:v3}
#或
k: k1: v1k2: v2k3: v3

数组:一组按次序排列的值。array、list、queue

#行内写法:  
k: [v1,v2,v3]
#或者
k:- v1- v2- v3

4、配置文件值注入

/*** 将配置文件中配置的每一个属性的值,映射到这个组件中* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;*      prefix = "person":配置文件中哪个下面的所有属性进行一一映射** 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;**/
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {private String userName;private Boolean boss;private Date birth;private Integer age;private Pet pet;private String[] interests;private List<String> animal;private Map<String, Object> score;private Set<Double> salarys;private Map<String, List<Pet>> allPets;
}@Data
public class Pet {private String name;private Double weight;
}
person:userName: zhangsanboss: falsebirth: 2019/12/12 20:12:33age: 18pet: name: tomcatweight: 23.4interests: [篮球,游泳]animal: - jerry- marioscore:english: first: 30second: 40third: 50math: [131,140,148]chinese: {first: 128,second: 136}salarys: [3999,4999.98,5999.99]allPets:sick:- {name: tom}- {name: jerry,weight: 47}health: [{name: mario,weight: 47}]

我们可以导入配置文件处理器,以后编写配置就有提示了

<!--导入配置文件处理器,配置文件进行绑定就会有提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

4.1、properties配置文件在idea中默认utf-8可能会乱码

在 idea 中的配置文件(application.properties) 中配置有中文,但是读取后中文乱码,先检查配置文件的字符编码是否为 UTF-8;

原因:Intellij idea 中默认的字符集是 UTF-8的,但是配置文件默认的字符集不是 UTF-8,而是ASCII码

File-->settings-->Editor-->File Encodings:查看 Project Encoding 和 Default encoding for properties files 的值是否为 UTF-8,如果不是则设置为 UTF-8

4.2、@Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

复杂类型封装

支持

不支持

配置文件yml 还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

4.3、配置文件注入值数据校验

4.3.1 @Valid与@Validated作用

@Valid与@Validated都是用来校验接收参数的,如果不使用注解校验参数,那么就需要在业务代码中校验,这样会增加很多的工作量并且代码不优美。

@Validated与@Valid区别:

  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测

  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测

SpringBoot使用@Valid注解需要引入如下POM


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

4.3.2 @Valid详解

如果@Valid|Validated校验不通过,那么错误信息就会封装到BindingResult对象了,可以通过BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下:

public class Employee {@NotBlank(message = "手机号码不能为空")@Length(message = "电话不能超过{max}个字符", max = 2)private String phone;@NotNull(message = "年龄不能为空")@Range(message = "年龄范围在{min}到{max}之间", min = 1, max = 10)private Integer age;@NotEmpty(message = "兴趣爱好不能为空")@Size(message = "兴趣爱好不能超过{max}个", max = 5)private List<String> hobbylist;// set,get省略
}
@RestController
@RequestMapping("/valid")
public class ValidControllerTest {@GetMapping("/test1")// 需要用 BindingResult 来做一个校验结果接收。// 当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;public String test1(@Valid Employee employee, BindingResult bindingResult){if(bindingResult.hasErrors()){// 返回错误数据给浏览器StringBuilder sb = new StringBuilder();bindingResult.getAllErrors().forEach(v -> {sb.append(v.getDefaultMessage());sb.append('\n');});return sb.toString();}return "数据校验通过";}// http://localhost:8888/valid/test1?phone=&age=&hobbylist=// 浏览器输出:年龄不能为空 手机号码不能为空 兴趣爱好不能为空// http://localhost:8888/valid/test1?phone=123456&age=34&hobbylist=1,2,3,4,5,6,7// 浏览器输出:电话不能超过2个字符 兴趣爱好不能超过5个 年龄范围在1到10之间
}

4.3.3 @Validated

SpringMVC注解,用于数据校验,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行。

@RestController
@RequestMapping("/validated")
public class ValidatedControllerTest {@GetMapping("/test1")//@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,// 这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。public String doLogin(@Validated Employee employee){return "数据校验通过";}// http://localhost:8888/validated/test1?phone=&age=&hobbylist=// There was an unexpected error (type=Bad Request, status=400).// Validation failed for object='employee'. Error count: 3}
@RestControllerAdvice //增强的 @RestController,可用于全局异常处理
public class ValidExceptionHandler {@ExceptionHandlerpublic String validExceptionHandler(BindException exception) {StringBuilder sb = new StringBuilder();exception.getAllErrors().forEach(v -> {sb.append(v.getDefaultMessage());sb.append("\n");});return sb.toString();}
}

4.3.4 嵌套检测

嵌套检测就是在一个beanA中,存在另外一个beanB属性。嵌套检测beanA同时也检测beanB。

public class BeanA {@NotNull(message = "beanB不能为空")//@Validprivate BeanB beanB;// 省略 get,set
}
public class BeanB {@NotNull(message = "数量不为空")@Max(message = "数量最大为{value}", value = 10)@Min(message = "数量最小为{value}", value = 0)private int count;// 省略 get,set
}beanB 没有添加 @Valid 注解,所以只能检测 beanB 属性不为空,但是不能
检测 beanB 对象中 count 属性定义的最大值和最小值。@RestController
@RequestMapping("/valid")
public class ValidControllerTest {@PostMapping("/test2")// 嵌套检测public String test2(@Valid @RequestBody BeanA beanA, BindingResult bindingResult){if(bindingResult.hasErrors()){// 返回错误数据给浏览器StringBuilder sb = new StringBuilder();bindingResult.getAllErrors().forEach(v -> {sb.append(v.getDefaultMessage());sb.append('\n');});return sb.toString();}return "数据校验通过";}/**测试数据:{"beanB":{"password":12}}不加 @Valid 注解:数据校验通过加了 @Valid 注解:数量最大为10*/
}

4.3.4 常用注解说明

@AssertFalse:所注解的元素必须是Boolean类型,并且值为false@AssertTrue:所注解的元素必须是Boolean类型,并且值为true@DecimalMax:所注解的元素必须是数字,并且值要小于或等于给定的BigDecimalString值@DecimalMin:所注解的元素必须是数字,并且值要小于或等于给定的BigDecimalString值@Digits:所注解的元素必须是数字,并且它的值必须有指定的位数@Email:所注解的元素要匹配指定的正则表达式@Max:所注解的元素必须是数字,并且值要小于或等于给定的值。注意如果@Max所注解的元素是null,则@Max注解
会返回true,所以应该把@Max注解和@NotNull注解结合使用@Min:所注解的元素必须是数字,并且值要大于或等于给定的值。注意如果@Min所注解的元素是null,则@Min注解
会返回true,即也会通过校验,所以应该把@Min注解和@NotNull注解结合使用。@NotBlank:所注解的元素不能为null且不能为空白,用于校验CharSequence(含String、StringBuilder和StringBuffer)@NotEmpty:所注解的元素不能为null且长度大于0,可以是空白,用于校验CharSequence、数组、Collection和Map@NotNull:所注解的元素不能为null@Null:所注解的元素必须为null@Pattern:所注解的元素必须匹配指定的正则表达式。注意如果@Pattern所注解的元素是null,则@Pattern注解会返回
true,即也会通过校验,所以应该把@Pattern注解和@NotNull注解结合使用@Size:所注解的元素必须符合指定的大小,该注解可用于数组,CharSequence(含String、StringBuilder和
StringBuffer),Collection和Map。注意如果@Size所注解的元素是null,则@Size注解会返回true,即也
会通过校验,所以应该把@Size注解和@NotNull注解结合使用

4.4 @PropertySource&@ImportResource&@Bean

@PropertySource:加载指定的配置文件;

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String userName;private Integer age;private Boolean boss;
}

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件不能自动识别

想让Spring的配置文件生效,加载进来,@ImportResource标注在一个配置类上

======================beans.xml=========================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="haha" class="com.atguigu.boot.bean.User"><property name="name" value="zhangsan"></property><property name="age" value="18"></property></bean><bean id="hehe" class="com.atguigu.boot.bean.Pet"><property name="name" value="tomcat"></property></bean>
</beans>
@ImportResource("classpath:beans.xml")
@Configuration
public class MyConfig {}======================测试=================boolean haha = run.containsBean("haha");boolean hehe = run.containsBean("hehe");System.out.println("haha:"+haha);//trueSystem.out.println("hehe:"+hehe);//true

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

  1. 配置类@Configuration------>Spring配置文件

  1. 使用@Bean给容器中添加组件

/*** @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件** 在配置文件中用<bean><bean/>标签添加组件**/
@Configuration
public class MyAppConfig {//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名@Beanpublic HelloService helloService02(){System.out.println("配置类@Bean给容器中添加组件了...");return new HelloService();}
}

4.5 随机数

blog:# 随机字符串value: ${random.value}# 随机 intnumber: ${random.int}# 随机 longbignumber: ${random.long}}# 10 以内的随机数test1: ${random.int(10)}# 10-20的随机数test2: ${random.int[10,20]}

4.6 占位符

方式一

在配置文件内可以直接使用占位符来进行配置的相互引用,如下所示:

#自定义的属性,引用了spring.application.name
guo:name: ${spring.application.name}spring:application:name: sc-gateway-application

在上面的配置中,name配置直接引用了spring.application.name的配置值,这样我们在系统中通过@Value("${guo.name}")或者通过@ConfigurationProperties方式使用时,得到的值都为sc-gateway-application

方式二

占位符——形如:${guo.name} 是一种灵活的配置方式,可以让我们很灵活的使用配置参数,这种方式可以从Environment内获取对应的配置值。

在实际部署应用程序时,有很多通过命令行参数方式实现配置是动态,不过SpringBoot所提供的配置参数名称都比较长,对此我们完全可以利用占位符配置方式实现自定义参数名。

占位符是从Environment内读取对应的配置值,而命令行参数在应用程序启动时会被一并加入到Environment中,因此也就实现了占位符动态配置,其实这个“短”的含义,是你定义的新的配置名称比较短而已。

假设我们的guo.name值需要动态指定,我们自定义一个短变量名称my-name,配置文件改为:

guo# 占位符获取配置的值,如果没有可以用:指定默认值name: ${my-name:erbadagang}

在运行前,配置my-name的值为trek

运行返回:configname = trek

实际运行中多数是使用jar命令启动,所以上图配置方法的等同: java -jar project-1.0.0.SNAPSHOT.jar --my-name=trek

方式三

像上图红色标注的,都会被完整的替换为根目录,这样在安装项目时,只需修改一处就行了。

5、SpringBoot多环境配置

5.1、多Profile文件

在Spring Boot中多环境配置⽂件名需要满⾜ application-{profile}.properties/ymal 的格式,其

中 {profile} 对应你的环境标识,⽐如:

  • application-dev.properties :开发环境

  • application-test.properties :测试环境

  • application-prod.properties :⽣产环境

⾄于哪个具体的配置⽂件会被加载,需要在 application.properties/yml ⽂件中通过 spring.profiles.active 属性来设置,其值对应 {profile} 值。

如: spring.profiles.active=test 就会加载 application-test.properties 配置⽂件内容。

默认使用application.properties的配置;

使用方法:application.properties/yml中配置通⽤内容,并设置 spring.profiles.active=dev ,以开发环境为默认配置,application-{profile}.properties/yml 中配置各个环境不同的内容

激活指定profile

​ 1、在配置文件中指定 spring.profiles.active=dev

​ 2、命令行:

​ java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

​ 多个参数时,用空格隔开,命令行参数优先级高于 jar 文件内部的配置文件参数

​ 3、虚拟机参数;

​ -Dspring.profiles.active=dev

5.2、yml文档块方式

1、yml 文件支持多文档块方式,同一个 yml 文件中,可以使用"---"来区分不同的文档,相当于不同的配置文件

2、这也是 Spring Boot 官方推荐的方式


spring:profiles:active: devel #指定激活哪个环境配置,激活后,第一个文档内容失效;不指定时,以第一个文档为准
server:port: 8083
--- #"---"用于分隔不同的profiles()文档块
spring:profiles: devel #指定环境标识为"devel",相当于"application-{profile}.properties/yml"中的profile
server:port: 8081
---
spring:profiles: deploy #指定环境标识为"deploy",相当于"application-{profile}.properties/yml"中的profile
server:port: 8082

6、配置文件位置与加载顺序

1)Spring boot 启动时自动扫描以下位置的 application.properties 或者 application.yml 文件作为 Spring boot 的默认配置文件。

–file:./config/ -------------整个项目根目录下的config目录下
–file:./ ---------------------整个项目根目录下
–classpath:/config/---------类路径下的config目录下
–classpath:/-----------------类路径根目录下

2)优先级从上往下由高到底,高优先级的配置会覆盖低优先级的配置;Spring Boot 会从这四个位置加载所有的主配置文件,如果高优先级的内容与低优先级的内容相同,则覆盖;如果低优先级的内容在高优先级中没有,则形成互补。

3、应用启动后,1 位置的端口会生效,控制台会输出:Tomcat started on port(s): 8081 (http) with context path '/coco'

4、项目打包之后,与 jar 同目录下的位置相当于位置2,与 jar 同目录下的 config 子目录相当于位置 1.

7、外部配置加载位置与顺序

Spring Boot 支持多种外部配置方式,如下所示,从上往下加载优先级由高到低,内容相同时覆盖,不相同时累加。

1、命令行参数

2、来自 java:comp/env 的 JNDI 属性

3、使用“spring.config.location”改变默认的配置文件位置

4、Java 系统属性(System.getProperties())

5、操作系统环境变量

6、RandomValuePropertySource 配置的 random.* 属性值

由jar包外向jar包内进行寻找;

优先加载带profile

7、jar 包外部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件

8、jar 包内部的 application-{profile}.properties 或 application.yml (带spring.profile) 配置文件

再来加载不带profile

9、jar 包外部的 application.properties 或 application.yml (不带spring.profile) 配置文件

10、jar 包内部的 application.properties 或 application.yml (不带spring.profile) 配置文件

11、@Configuration注解类上的@PropertySource

12、通过SpringApplication.setDefaultProperties指定的默认属性

官方文档:Externalized Configuration

命令行参数

1、命令行参数格式:java -jar xxxxx.jar --server.port=8082

2、多个参数时,用空格隔开,如: java -jar xxxxx.jar --server.port=8082 --server.servlet./context-path=/coco

3、修改端口同时指定上下文路径,命令行参数优先级高于 jar 文件内部的配置文件参数。

spring.config.location

1、通过 --spring.config.location 可以指定新的配置文件位置,自定义的外部配置文件优先级高于Jar文件内部的配置文件。

2、项目打包好以后,使用命令行参数的形式,启动项目的时候来指定配置文件的新位置:

  1. 新指定的配置文件和默认加载的这些配置文件共同起作用形成互补配置;

  1. 格式:java -jar spring-boot-xxx.jar --spring.config.location=G:/application.properties

  1. spring-boot-xxx.jar 是打包好的应用文件、G:/application.properties是新的配置文件路径

3、当 application.properties 或 application.yml 文件在 xxx.jar 应用同目录下时,可以省略 --spring.config.location,直接双击运行,它会自动读取当前目录下的配置 application.properties 或 application.yml 文件。

8、Spring Boot 核心配置文件

1、SpringBoot 的核心配置文件有两个:bootstrap (.yml 或者 .properties),application (.yml 或者 .properties)。

2、Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文。两个上下文共用一个环境,它是任何 Spring 应用程序的外部属性的来源。

3、boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载,都可以用来配置参数。

4、bootstrap 优于 application 加载;bootstrap 偏向系统层级的参数配置,Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。application 偏向应用层级的参数配置。

4、使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

a、一些固定的不能被覆盖的属性

b、一些加密/解密的场景;

参考文章:SpringBoot2.x配置文件使用占位符的几种方式_springboot 配置文件占位符

Spring Boot 核心配置文件,yml 语法规范、 多环境配置、配置文件加载顺序_springboot核心配置文件

@Valid与@Validated区别_valid和validated的区别

相关文章:

SpringBoot学习笔记(二)配置文件

1、配置文件SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1b;application.propertiesapplication.yml配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值&#xff1b;SpringBoot在底层都给我们自动配置好&#xff1b;YAML&#xff1a;以数…...

09说说乐观锁和悲观锁

乐观锁和悲观锁是在并发编程中经常用到的两种锁机制。悲观锁是指在访问共享资源之前&#xff0c;会先加锁&#xff0c;以防止其他线程修改该资源&#xff0c;从而保证数据的一致性和完整性。在使用悲观锁时&#xff0c;如果一个线程已经占用了该资源&#xff0c;那么其他线程只…...

【C++】vector的模拟实现

文章目录1.查看STL源码2.vector的模拟实现1. 构造函数无参构造构造n个 val迭代器模板2. reserve3. 迭代器4.pop_back 尾删5.resize6.push_back7.insert迭代器失效—— pos为野指针迭代器失效——修改迭代器位置8. erase对于VS和Linux环境测试3.深浅拷贝问题4. 整体代码实现1.查…...

THUPC-2023 游记

清华校赛&#xff0c;战火重燃 原文链接 宣传图 上周四同学在洛谷无意间看到了宣传图&#xff0c;当时很有感触。不知觉间&#xff0c;又是一年春&#xff0c;又是一场触动心弦的 THUPC 了。 周五的团建过于有趣&#xff0c;致使我完全将 THUPC 抛之脑后了。 周日上午被省选…...

Linux - 磁盘I/O性能评估

文章目录概述RAID文件系统与裸设备的对比磁盘I/O性能评判标准常用命令“sar –d”命令组合“iostat –d”命令组合“iostat –x”单独统计某个磁盘的I/O“vmstat –d”命令组合小结概述 RAID 可以根据应用的不同&#xff0c;选择不同的RAID方式 如果一个应用经常有大量的读操…...

计算机网络--网络基础

目录 一.互联网的组成 ​编辑 1.互联网的边缘部分 1.1客户-服务器方式 1.2对等连接方式 ​编辑 2.互联网的核心部分 2.1电路交换 2.2分组交换 2.3报文交换 二.计算机网络的类别 1.按网络的作用范围进行分类 2.按网络的使用者进行分类 3.用来把用户接入互联…...

Gin 接口超时控制

文章目录1.Gin 的 Middleware2.gin-contrib/timeout3.小结参考文献API 是现代应用程序中的重要组成部分&#xff0c;可以用于提供数据和功能&#xff0c;供客户端应用程序访问。由于网络不稳定、服务器负载、网络拥堵等因素&#xff0c;API 请求可能会花费较长时间。这可能导致…...

1.C#与.NET简介

目录 一、C#语言及其特点 二、C#与.NET Framework/.NET Core关系 三、C#应用开发 四、案例展示 五、学习环境 一、C#语言及其特点 C#是美国微软公司发布的一种面向对象的&#xff0c;运行于 .NET Framework 和 .NET Core &#xff08;完全开源&#xff0c;跨平台&#xff…...

OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人

内容一览&#xff1a; 「她时代」来临&#xff0c;一些有着强大信念与热情的女性&#xff0c;纷纷投身至 AI 领域&#xff0c;成为不可或缺的存在与力量。值此国际妇女节到来之际&#xff0c;HyperAI超神经盘点了领域内令人印象深刻的杰出的女性代表。 关键词&#xff1a;国际妇…...

[ 网络 ] 应用层协议 —— HTTP协议

目录 1.HTTP协议 1.1URL urlencode和urldecode 2. HTTP协议格式 HTTP请求 HTTP响应 3.告知服务器意图的HTTP方法 GET&#xff1a;获取资源 POST&#xff1a;传输实体主体 GET和POST的区别 使用Cookie的状态管理 4.返回结果的HTTP状态码 状态码告知从服务器端返回的…...

Spring Boot 整合 Redisson 缓存性能客户端(2023-03-06)

Spring Boot 整合 Redisson 缓存 (官网) 介绍: Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorte…...

【C和C++】输出100内能够被13整除的数,取模判断方法

目录 前言基础概念重温整除例子小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就是金钱(…...

STC8单片机基于开源库读取DS18B20数据例程

STC8单片机基于开源库读取DS18B20数据例程 📍开源库FwLib_STC8 Github地址:https://github.com/IOsetting/FwLib_STC8📌STC官方STC8库函数资源:https://www.stcai.com/khs🎉本次利用FwLib_STC8库读取DS18B20,由于该开源库是基于VSCode编写,默认使用的是SDCC编译器,在…...

计算机专业毕业设计基于Spring Boot 学生在线考试系统

目录 一、学生端 1.1 登录 1.2 注册 1.3 学生首页 1.4 学生查看任务中心的试卷&#xff08;已答卷/未答卷&#xff09; 1.5 学生查看固定试卷以及开始做题 1.6 学生查看时段试卷以及开始做题 1.7 学生查看试卷中心 1.8 学生查看考试记录以及查看试卷 1.9 学生查看…...

【读书笔记】《深入浅出数据分析》第八章 启发法

目录一&#xff0c;什么是启发法&#xff1f;1&#xff0c;那什么是启发法&#xff1f;2&#xff0c;心理学上对启发法定义二&#xff0c;活动分析1&#xff0c;如何去分析活动效果呢&#xff1f;1.1 活动前期&#xff08;活动前1-2周&#xff09;1.2 活动中期1.3 活动结束一&a…...

英飞凌Tricore实战系列导读

本文框架 1.系列概述1.1 外设理论及应用介绍1.2 基于TC3xx的MCAL各外设配置开发1.3 基于TC3xx的Davinci工程开发1.4 项目中问题排查经验分享1.5 其他相关话题分享2. 目前已发布系列文章汇总1.系列概述 英飞凌TC3xx以其强大的性能,扩展性,存储及安全性能在汽车电子中扮演着越…...

做数据分析有前景吗?

当然有前景的。 每个行业都有发展前景&#xff0c;只是看你自身的技能情况或者关系人脉、软实力方面是否到位&#xff0c;不同的行业要求不一样。作为数据分析领域而言&#xff0c;属于IT行业&#xff0c;看的是你的专业技能&#xff1b;只要你技能过硬&#xff0c;就能在行业…...

Rust Web入门(六):服务器端web应用

本教程笔记来自 杨旭老师的 rust web 全栈教程&#xff0c;链接如下&#xff1a; https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...

1.特定领域知识图谱知识融合方案(实体对齐):金融产业产业知识图谱-基于内容匹配和图模型的品牌知识链指

1 引言 供应链金融是一种围绕经营关系,以核心企业为依托,针对中小企业的新型金融服务。如何精准地还原企业间的经营关系,是供应链金融的关键所在。知识图谱是描绘实体间关系的网络结构,对于挖掘企业关系有重要意义。在真实场景中,仅有企业与用户的微观知识对于还原经营关系…...

前端基础语法合集

JS语法基础1-注释//单行注释/*......*/多行注释2-分号&#xff1b;用作分割javascript语句&#xff0c;可以省略。3-变量定义定义变量使用varvar a;//声明变量 var a100;//声明变量并赋值 var b,c;//声明多个变量 var d20;bd1;cb1;//一行多条语句要用;分割4-数据类型判断该变量…...

百亿补贴,京东的自卫反击战

“百亿补贴”这个词大家有没有很熟悉&#xff1f;大部分人应该是在看拼多多投放广告的时候&#xff0c;知道这个词的吧。而京东APP也于近日在升级11.6.2版本时&#xff0c;在更新日志中明确提到&#xff1a;“京东3.8节&#xff0c;百亿补贴上线”。至此&#xff0c;发酵数日的…...

融云入选中国信通院《高质量数字化转型产品及服务全景图》

企业数字化转型正在进入“深水区”。 3 月 3 日&#xff0c;“中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;高质量数字化转型创新发展大会暨中国信通院‘铸基计划’年度峰会”在京召开&#xff0c;深度展示了中国信通院在数字化转型领域的工作成果&#xff…...

开源消息代理组件mosquitto

# ll total 556 -rw-r----- 1 sk sk 148417 Mar 6 14:59 libuv-1.44.2-1.el7.x86_64.rpm -rw-r----- 1 sk sk 120717 Mar 6 14:59 libwebsockets-3.0.1-2.el7.x86_64.rpm -rw-r----- 1 sk sk 293429 Mar 6 14:59 mosquitto-1.6.10-1.el7.x86_64.rpm 将用到的依赖上传到主机…...

vuex的五个属性及使用方法示例

一&#xff0c;Vuex简介 Vuex是Vue.js的状态管理库&#xff0c;它通过中心化的状态管理使得组件间的数据共享更加容易。 Vuex包含五个核心属性&#xff1a;state、getters、mutations、actions和modules。 Vuex是Vue.js的状态管理库&#xff0c;它提供了一种集中式存储管理应…...

9.SpringSecurity核心过滤器-SecurityContextPersistenceFilter

SpringSecurity核心过滤器-SecurityContextPersistenceFilter 一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个&#xff0c;作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包&#xff0c;认证和授权的核心代码都在这里面spring-security-co…...

23种设计模式-桥接模式

概念 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象与其实现分离来解耦。它使用接口&#xff08;抽象类&#xff09;作为桥梁&#xff0c;将一个抽象类与其实现类的代码分别独立开来&#xff0c;从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”…...

TCP PMTU 静态路由

HTTP协议 --- 超文本传输协议TCP --- 80端口超文本 --- 包含有超链接link和多媒体元素标记的文本TCP协议是一种面向连接的可靠性传输协议面向连接&#xff1a;数据在传输前&#xff0c;收发双方建立一条逻辑通道。可靠性确认机制&#xff1a;传输确认&#xff0c;每接受一个数据…...

Android动画——属性动画

在属性动画中&#xff0c;常用到的API有ValueAnimator&#xff0c;ObjectAnimator。ValueAnimator&#xff1a;时间引擎&#xff0c;负责计算各个帧的属性值&#xff0c;基本上其他属性动画都会直接或间接继承它&#xff1b;ObjectAnimator&#xff1a; ValueAnimator 的子类&a…...

华为OD机试真题Python实现【寻找连续区间】真题+解题思路+代码(20222023)

寻找连续区间 题目 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 第一行两个整数N x (0 < N <= 100000 ,0 <= x <=…...

15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 …...

沃尔玛超市/无线网络优化

前言LIUNX服务器部署&#xff0c;百度找的资料有些都是老的。查了一些资料顺便整合了一下&#xff0c;阿里云服务器(ECS)可以选择多种操作系统&#xff0c;打算用它运行Drupal或者WordPress&#xff0c;你最好选择Liunx系统&#xff0c;这篇文章的演示是基于阿里云的CentOS操作…...

wordpress手动更新插件/百度推广的方式

我有点困惑&#xff0c;我无法使用MSVC在Windows上进行C开发设置Visual Studio Code . 网络上的所有人都说他们对设置和使用一切都很容易感到高兴&#xff0c;但我找不到任何简单的指南;他们中的大多数只是跳过设置部分&#xff0c;并显示一切有效&#xff0c;包括代码完成/智能…...

腾讯建站平台官网/百度竞价培训

如何打开文件Stud.txt&#xff0c;然后用"Orange"替换任何出现的"A"&#xff1f; 请(一如既往)遵循一般问题指南&#xff0c;说明任何特殊限制&#xff0c;显示您迄今为止尝试过的内容&#xff0c;并询问具体让您感到困惑的内容。 另外&#xff0c;请用[ho…...

搜索引擎wordpress/seo网站建设优化

1.下面是Sping技术栈所包含的技术框架图 2.Spring Boot的一些知识点 3.Spring Boot 推荐的基础 POM 文件 名称说明spring-boot-starter核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。spring-boot-starter-amqp通过 spring-rabbit 支持 AMQP。spring-boot…...

温州网站建设专业的公司/网络营销企业案例

用OpenInventor实现的NeHe OpenGL教程&#xff0d;第八课这节课我们将在第七节课的基础上增加纹理透明的效果。在OpenGL中&#xff0c;透明效果是通过“融合”&#xff08;Blend&#xff09;方式实现的。在NeHe教程中已经对融合的原理做了详细的讨论。这里我们就不再详细讨论了…...

wordpress可视化菜单/黄页推广

一、选择题(本题为单项选择题&#xff0c;每题1分&#xff0c;多选&#xff0c;不选或错选均不得分&#xff0c;)&#xff1a;(25分)1、世界上第一台电子数字计算机是(B)年出现的。A、1958B、1946C、1965D、19472、微型计算机的发展史可以看作是(A )的发展历史。A、微处理器B、…...