Spring Boot | Spring Boot的“核心配置“与“注解“

目录:

  • Spring Boot的核心配置与注解 :
    • 1. 全局配置文件 ( application.properties / application.yaml:创建项目时候自动生成,其会被“自动导入”到“程序”中 )
      • application.properties配置文件
      • application.yaml 配置文件 (推荐使用)
        • 当value值为 “普通数据类型” (如 : 数字、字符串、布尔等)
        • 当value值为 “数组” 或 “单列集合”
        • 当value值为 “Map集合” 或 “对象类型”
        • application.yaml 配置文件的“应用案例”
    • 2. “配置文件属性值” 的 “注入”
      • 使用@ConfigurationProperties( )注解将“配置文件”中的“属性值”注入到“属性”中 (注入“个别属性值”)
      • 使用@Value( )注解将“配置文件”中的“属性值”注入到“属性”中 (注入“个别属性值”)
      • 两种注解“对比分析”
        • 底层框架
        • 功能
        • 属性 setter 方法
        • 复杂类型属性注入
        • 松散绑定
        • JSR303 数据校验
        • SpEL表达式 ( 使用“SpEL表达式”为属性“直接注入值” )
      • 如何选择使用这“两种注解”?

Spring Boot的核心配置与注解 :

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


1. 全局配置文件 ( application.properties / application.yaml:创建项目时候自动生成,其会被“自动导入”到“程序”中 )

  • 全局配置文件 ( applicationContext.properties )能够对一些 默认配置值进行修改Spring Boot 使用一个 ① application.properties 或者 ② application.yaml文件作为 全局配置文件该文件存放src/main/resource目录 或者 类路径的 /config,一般会选择 resource目录

application.properties配置文件

  • 使用 Spring Initializr方式构建Spring Boot项目时,会在 src/main/resources目录自动生成一个空 application.properties文件Spring Boot项目启动时自动加载application.properties文件

  • 我们可以在application.properties 文件中定义 Spring Boot 项目相关属性,当然,这些相关属性可以是 系统属性环境变量命令参数等信息,也可以是 自定义配置文件名称位置示例代码如下:

    spring.application.name=chapter_02
    server.address=80
    server.port=8443
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.config.additional-location=
    spring.config.location=
    spring.config.name=application
    
  • 关于applicationContext.properties案例 ( 例子如 ) :

    Pet.java :

    package com.myh.chapter_03.domain;public class Pet {private String type;private String name;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Pet{" +"type='" + type + '\'' +", name='" + name + '\'' +'}';}}
    

    Person.java

    package com.myh.chapter_03.domain;import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;import java.util.Arrays;
    import java.util.List;
    import java.util.Map;@Component //用于将Person类加入到IOC容器中 (只有这样Person对象才能被 @ConfigurationProperties()注解赋值 )@ConfigurationProperties(prefix = "person")//将配置文件(application.properties)中以person开头的数据通过“set方法”注入到该类中"属性"
    public class Person {/*** 通过 @ConfigurationProperties(prefix = "person") 注解来将 application.properties中的"数据"注入到* 下面的“属性”中*/private int id;private String name;private List hobby;private String[] family;private Map map;private Pet pet;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 List getHobby() {return hobby;}public void setHobby(List hobby) {this.hobby = hobby;}public String[] getFamily() {return family;}public void setFamily(String[] family) {this.family = family;}public Map getMap() {return map;}public void setMap(Map map) {this.map = map;}public Pet getPet() {return pet;}public void setPet(Pet pet) {this.pet = pet;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", hobby=" + hobby +", family=" + Arrays.toString(family) +", map=" + map +", pet=" + pet +'}';}
    }
    

    @ConfigurationProperties(prefix =“person”)注解作用 是将配置文件person开头属性值通过setter方法注入实体类对应属性 中。@Component注解 的作用是当前注入属性值的 Person类对象作为 Bean 组件放到 Spring 容器中,只有 这样它才能被 @ConfigurationProperties注解赋值

    上述自定义 Person类中,添加了一个 @Component注解,将该自定义类作为 Spring容器的组件 ( 简而言之,就是 该类给IOC容器管理 ),其根本目的是让 Spring Boot 可以自动扫描到该组件,然后进行其他功能实现。


    application.properties

    #对实体类对象Person进行属性配置
    person.id = 1
    person.name = tom
    person.hobby = play,read,sleep
    person.family = father,mother
    person.map.k1 = v1
    person.map.k2 = v2
    person.pet.type = dog
    person.pet.name = kity
    

    Spring Boot默认全局配置文件 : application.properties 中的数值将会通过 @ConfigurationProperties( ) 注解 注入到对应实体类 中。


    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.myh</groupId><artifactId>chapter_03</artifactId><version>0.0.1-SNAPSHOT</version><name>chapter_03</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!--    web应用场景依赖启动器    --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--    单元测试依赖启动器    --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency><!--   “热部署”依赖启动器   --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!--   是生成配置元数据,以提供更好的配置文件支持和开发体验。它能够帮助开发人员更方便地使用配置文件,并提高开发效率   --><!--在编写application.properties配置文件时,由于要配置的Person 对象属性是我们自定义的,SpringBoot 无法自动识别,所以不会有任何书写提示。在实际开发中,为了出现代码提示的效果来方便配置,在使用@ConfigurationProperties注解进行配置文件属性值注入时,可以在pom.xmI文件中添加一个Spring Boot 提供的配置处理器依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency></dependencies><!--    Maven打包工具插件   -->
    <!--    <build>-->
    <!--        <plugins>-->
    <!--            <plugin>-->
    <!--                <groupId>org.springframework.boot</groupId>-->
    <!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
    <!--            </plugin>-->
    <!--        </plugins>-->
    <!--    </build>--></project>
    

    Chapter03ApplicationTests.java ( 单元测试类 ):

    package com.myh.chapter_03;import com.myh.chapter_03.domain.Person;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) //测试运行器,并加载SpringBoot测试注解
    @SpringBootTest //标记该类为“单元测试类”,并加载项目的上下文环境ApplicationContext
    class Chapter03ApplicationTests {@Autowiredprivate Person person;@Testvoid contextLoads() {System.out.println(person);}
    }
    

    运行 contextLoads( )方法控制台输出结果如下图所示 :
    在这里插入图片描述
    方法执行结果.jpg)信息成功打印,说明了 application.properties文件 属性配置正确,并通过 相关注解自动完成属性注入

application.yaml 配置文件 (推荐使用)

  • YAML文件格式Spring Boot 支持 的一种 JSON 超集文件格式,相较于传统Properties配置文件YAML文件数据核心,是一种更为 直观容易被计算机识别数据序列化格式
  • application.yaml 配置文件的 工作原理application.properties一样的,只不过YAML格式配置文件看起来 更简洁一些
  • application.yaml 文件用“ key: + 空格 + value”格式配置属性,使用缩进控制层级关系。这里我们 针对不同数据类型属性值,介绍一下YAML文件配置属性写法,具体如下所示 。
当value值为 “普通数据类型” (如 : 数字、字符串、布尔等)
  • (1) value 值为 普通数据类型( 如数字字符串布尔等)
    YAML 配置文件中配置的 属性值普通数据类型 时,可以 直接配置对应属性值,同时对 字符串类型属性值不需要额外添加引号示例代码如下

    #当属性值为普通数据类型(如:数字、字符串、布尔等),属性值不需要”额外添加引号“
    #8081 和 /hello因为是"普通数据类型",所以都没添加额外的引号
    #port和path属于“同一级别”
    Server:port: 8081path: /hello
    
当value值为 “数组” 或 “单列集合”
  • (2) value 值为 数组单列集合
    YAML 配置文件中配置的 属性值数组单列集合类型 时,主要有 两种书写方式①缩进式写法②行内式写法

    ①缩进式写法 :

    #缩进式写法
    person1:hobby:- play- read- sleepperson2:hobby:play,read,sleep  
    

    ②行内式写法 :

    #行内式写法
    person4:hobby: [play,read,sleep]#使用行内式设置属性值时, []是可以省略的,程序会自动匹配校队"属性的值"
    person5:hobby: play,read,sleep
    
当value值为 “Map集合” 或 “对象类型”
  • (3) value 值为 Map 集合对象类型 时,主要同样 有两种书写方式①缩进式写法②行内式写法

    ①缩进式写法 :

    #value值为Map或对象时的写法
    #Map类型
    #缩进式写法
    person6:map:k1: v1k2: v2
    

    ②行内式写法 :

    #Map类型
    #行内式写法,此处用的符号是: 大括号{}
    person7:map: {k1: v1,k2: k3}
    

    ps :

    此处用的 符号 是: 大括号{ }

application.yaml 配置文件的“应用案例”
  • application.yaml :

    #对实体类对象Person进行属性设置, 一样是通过 @ConfigurationProperties()注解来将下面的"数据值"注入到"类"的"属性"中的
    person2:id: 1name: 张三hobby: [play,read,sleep]family: [father,mother]map: {k1: v1,k2: v2}pet: {type: dog,name: kitty}
    

    Person.java :

    package com.myh.chapter_03.domain;import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;import java.util.Arrays;
    import java.util.List;
    import java.util.Map;@Component //用于将Person类加入到IOC容器中 (只有这样Person对象才能被 @ConfigurationProperties()注解赋值 )@ConfigurationProperties(prefix = "person2")//将配置文件( application.yaml )中以person2开头的数据通过“set方法”注入到该类中"属性"
    public class Person {/*** 通过 @ConfigurationProperties(prefix = "person") 注解来将 application.properties中的"数据"注入到* 下面的“属性”中*/private int id;private String name;private List hobby;private String[] family;private Map map;private Pet pet;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 List getHobby() {return hobby;}public void setHobby(List hobby) {this.hobby = hobby;}public String[] getFamily() {return family;}public void setFamily(String[] family) {this.family = family;}public Map getMap() {return map;}public void setMap(Map map) {this.map = map;}public Pet getPet() {return pet;}public void setPet(Pet pet) {this.pet = pet;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", hobby=" + hobby +", family=" + Arrays.toString(family) +", map=" + map +", pet=" + pet +'}';}
    }
    

    Chapter03ApplicationTests.java ( 单元测试类 ):

    package com.myh.chapter_03;import com.myh.chapter_03.domain.Person;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) //测试运行器,并加载SpringBoot测试注解
    @SpringBootTest //标记该类为“单元测试类”,并加载项目的上下文环境ApplicationContext
    class Chapter03ApplicationTests {@Autowiredprivate Person person;@Testvoid contextLoads() {System.out.println(person);}
    }
    

    运行 contextLoads( )方法控制台输出结果如下图所示 :
    在这里插入图片描述
    信息成功打印,说明了 application.yaml文件 属性配置正确,并通过 相关注解自动完成属性注入

    通过对比可以发现YAML配置文件的格式更加简洁、方便推荐使用YAML格式文件

2. “配置文件属性值” 的 “注入”

  • 使用Spring Boo 全局配置文件 ( application.properties / application.yaml )配置 属性 时, 如果配置的属性Spring Boot 默认提供的属性 ,例如服务器端口server.port,那么Spring Boot内部会自动扫描并读取属性值 ( 因为那是 默认提供的属性 )。 如果配置的属性是 用户自定义属性,例如 :自定义Person 实体类属性,则必须在程序中注入这些配置属性 ( 通过 @ConfigurationProperties( )注解进行“属性值”的注入 )方可生效。

  • Spring Boot 支持 多种注入配置文件属性方式 :

    使用 注解@ConfigurationProperties ( )注解“注入属性” 使用 @Value( )注解 “注入属性”

使用@ConfigurationProperties( )注解将“配置文件”中的“属性值”注入到“属性”中 (注入“个别属性值”)

  • Spring Boot提供的 @ConfigurationProperties注解 用来快速、方便地 配置文件中自定义
    属性值批量注入 某个Bean 对象多个对应属性
    中。假设现在有一个配置文件,使用 @ConfigurationProperties 注入配置文件的属性示例代码如下 :

    @Component //将该类交给IOC容器管理,变成一个bean
    //该注解的作用: 将配置文件中自定义的"属性值"注入到某个bean对象中的"对应属性"中
    @ConfigurationProperties(prefix = "person")//将配置文件( application.properties/application.yaml )中以后person开头的数据通过“set方法”注入到该类中"属性"
    public class Person {private int id;//属性的set方法public void setId(int id) {this.id = id;}
    }
    

    上述代码使用 @Component@ConfigurationProperties(prefix =“person”)配置文件中每个属性映射person类属性中
    需要注意 的是,使用 @ConfigurationProperties 注解 批量注入属性值 时,要保证配置文件中的 属性 与对应实体类的 属性名一致否则无法 正确 获取并注入属性值

使用@Value( )注解将“配置文件”中的“属性值”注入到“属性”中 (注入“个别属性值”)

  • @Value注解Spring框架提 供的,用来 读取配置文件中的属性值 并逐个 注入Bean对象对应属性Spring Boot 框架对Spring 框架中的 @Value注解进行了 默认继承,所以在Spring Boot 框架中还可以使用该注解 读取注入配置文件属性值

    @Component //将该类交给IOC容器管理,变成一个bean
    public class Person {@Value("${person.id}") //将配置文件中的“属性值”注入到该类的属性中private int id;
    }
    

    上述代码中,@Component注解@Value注解用于 注入Personid属性。其中,@Value 不仅支持注入Person的 id 属性,而且 还可以直接id属性赋值,这是 @ConfigurationProperties( )注解 不支持 的。

  • 例子如

    Student.java

    package com.myh.chapter_03.domain;import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;import java.util.Arrays;
    import java.util.List;
    import java.util.Map;@Component //将该类添加到IOC容器中,作为一个bean(被IOC容器管理)
    public class Student {//用该注解将配置文件中的"属性值"注入到该类的“属性”中@Value("${person.id}")private int id;@Value("${person.name}")private String name;private List hobby;private String[] family;private Map map;private Pet pet;@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", hobby=" + hobby +", family=" + Arrays.toString(family) +", map=" + map +", pet=" + pet +'}';}
    }
    

    pom.xml

    #对实体类对象Person进行属性设置, 一样是通过 @ConfigurationProperties()注解来将下面的"数据值"注入到"类"的"属性"中的
    person:id: 1name: tomhobby: [play,read,sleep]family: [father,mother]map: {k1: v1,k2: v2}pet: {type: dog,name: kitty}
    

    Chapter03ApplicationTests.java (测试类):

    package com.myh.chapter_03;import com.myh.chapter_03.domain.Person;
    import com.myh.chapter_03.domain.Student;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) //测试运行器,并加载SpringBoot测试注解
    @SpringBootTest //标记该类为“单元测试类”,并加载项目的上下文环境ApplicationContext
    class Chapter03ApplicationTests {@Autowiredprivate Student student;@Testpublic void studentTest() {System.out.println(student);}
    }
    

    运行 studentTest( )方法控制台输出结果如下图所示 :
    在这里插入图片描述

    注意点

    使用 @Value( )注解 注入的 属性类型 只能是“ 基本数据类型”。

两种注解“对比分析”

  • @ConfigurationProperties( )注解@Value( )注解对比 如下表所示

    对比@ConfigurationProperties( )注解@Value( )注解
    底层框架SpringBootSpring
    功能批量注入配置文件中的属性单个注入
    setter 方法需要不需要
    复杂类型属性注入支持支持
    松散绑定支持不支持
    JSR303 数据校验支持不支持
    SpEL表达式不支持支持
底层框架

@ConfigurationProperties注解是 Spring Boot框架自带 的;而 @Value 注解Spring 框架支持的,
只不过Spring Boot框架对Spring 进行了 默认支持,所以也可以使用@Value 注解的相关功能。

功能

@ConfigurationProperties能够将配置文件中的属性 批量注入 Bean对象,而@Value 只能 一个一个单独注入

属性 setter 方法
  • 在使用 @ConfigurationProperties注解进行配置文件 属性值读取注入 时,还必须为 每一个属性 设置 setter方法,通过对应的注解才能够将配置文件中属性一一匹配并注入对应的 Bean 属性上。如果配置文件中没有配置属性值,则会自动将对应的 Bean 属性设置为空。
    @ConfigurationProperties注解必须为每一个属性设setter方法,这样才能完成属性值的注入
  • @Value 完全不需要为属性设置setter方法,该注解会先通过表达式读取配置文件中指定的属性值,然后自动注入下方的Bean属性上。如果读取的配置文件属性为空,进行属性注入时程序会自动报错
复杂类型属性注入

@ConfigurationProperties( )注解 和 @Value注解 支持 任意数据类型属性注入,包括基本数据类型复杂数据类型

松散绑定
  • @ConfigurationProperties注解进行配置文件属性注入时,支持松散绑定语法。例如Person类有一个字符串类型的属性firstName,那么在配置文件中进行属性配置时可以使用如下配置方式示例代码如下 :

    person.firstName = james //标准写法,对应Person类属性名
    person.first-name = james //使用横线“-”分隔多个单词
    person.first_name = james //使用下划线"_"分隔多个单词
    person.FIRST_NAME = james //使用大小写格式,推荐常量属性配置

    如果要 注入上述松散绑定语法属性,那么使用 @Value 注入无效的,只能使用@ConfigurationProperties

JSR303 数据校验
  • @ConfigurationProperties注解进行配置文件属性值注入时,支持JSR303数据校验 ,其主要作用是 校验配置文件注入对应Bean属性 的值是否符合相关值的规则,示例代码如下 :

    @Component //加入到IOC容器中
    @ConfigurationProperties(prefix = "person")
    @Validated //引入Spring框架支持的"数据校验规则"
    public class Example {@Email //对属性进行规则匹配private String email;public void setEmail(String email) {this.email = email;}
    }

    上述代码中,使用 @ConfigurationProperties注解注入配置文件属性值时,在实体类Example上引入 @Validated 注解行数据校验,在属性email 上引入@Email 注解进行邮件规则校验。如果注入的配置文件属性值不符合相关校验规则,程序会自动报错。@Value 注解不支持 JSR303数据校验功能

SpEL表达式 ( 使用“SpEL表达式”为属性“直接注入值” )
  • @Value 注解 注入配置文件属性时,支持 SpEL表达式语法,即“#{xx}”。例如 Person 类有一个整数类型的属性id,直接使用 SpEL 表达式语法进行属性注入使用SpEL表达式直接为属性注入值
    示例代码如下

     //用SpEL来定义一个值, #{5*2} 是一个简单的数学表达式,它计算 5乘以 2的结果,将给结果注入到id属性中 
    @Value("#{5*2}") 
    private int id;
    

    上述代码不使用配置文件 的情况下,直接使用 @Value注解 支持的 SpEL表达式注入Bean ( 通过该 注解支持的SpEL表达式来“直接”为“属性注入值 )。而 @ConfigurationProperties注解 不支持此功能

如何选择使用这“两种注解”?

  • 如果只是针对某一个业务需求,要引入配置文件中个别属性值,推荐使用 @Value( )注解
    ( 如果只要 注入一两个属性值,用 @Value( )注解
  • 如果针对某个JavaBean类,需要 批量注入属性值,则推荐使用@ConfigurationProperties( )注解
    注解。
    (如果要 注入多个属性值推荐使用 @ConfigurationProperties( )注解

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

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

相关文章

GitLab更新失败(CentOS)

使用yum更新GitLab&#xff0c;出现如下错误提示&#xff1a; Error: Failed to download metadata for repo gitlab_gitlab-ce: repomd.xml GPG signature verification error: Bad GPG signature 编写如下脚本&#xff1a; for pubring in /var/cache/dnf/gitlab_gitlab-?…

基于nodejs+vue电影订票系统python-flask-django-php

本系统采用了node语言的express框架&#xff0c;数据采用MySQL数据库进行存储。结合进行开发设计&#xff0c;功能强大&#xff0c;界面化操作便于上手。本系统具有良好的易用性和安全性&#xff0c;系统功能齐全&#xff0c;可以满足电影订票的相关工作。 目 录 1 绪 论 3 1.1…

centos7 安装influxdb+telegraf+grafana 监控服务器

influxdb influxdb是一个时间序列数据库, 所有数据记录都会打上时间戳, 适合存储数字类型的内容 telegraf telegraf 可以用于收集系统和服务的统计数据并发送到influxdb grafana grafana 是一个界面非常漂亮, 可直接读取influxdb数据展示成各种图表的开源可视化web软件 安…

Gin中的gin.Context与Golang原生的context.Context区别与联系

一.gin中的context gin.Context 1.概念 在 Gin 中&#xff0c;Context 是一个非常重要的概念&#xff0c;它是Gin的核心结构体之一,用于处理 HTTP 请求和响应,在 Gin 的处理流程中&#xff0c;Context 贯穿整个处理过程&#xff0c;用于传递请求和响应的信息Gin 的 Context 是…

如何查询电脑是否被锁定了IP地址?锁定IP会出现什么问题?

前言 电脑刚到手的时候&#xff0c;基本上是通过路由器DHCP进行IP分配的。路由器DHCP分配IP给电脑的好处是网络不会出现IP冲突&#xff0c;网络能正常使用。 有些电脑可能在DHCP自动获取IP时出现错误&#xff0c;所以小伙伴就会通过手动设置IP让电脑可以正常上网。 这样的操…

【真题解析】题目 3151: 蓝桥杯2023年第十四届省赛真题-飞机降落【C++ DFS 超详解注释版本】

爆搜冥想 暴力枚举每一辆飞机对于每一个飞机都只存在两种情况&#xff0c;可以降落和不可以降落如果可以降落&#xff0c;计算降落后最早可以降落的时间pre&#xff0c;作为下一次递归的传参如果不可以降落&#xff0c;枚举下一辆飞机 注意这辆的降落有盘旋这种量子叠加态&…

【前端面试3+1】02插槽、箭头函数与普通函数、重绘重排、【回文数】

一、对插槽的理解 1.定义及作用&#xff1a; 插槽是一种用于在组件中插入内容的特殊语法。它的作用是让父组件可以向子组件传递内容&#xff0c;从而实现组件的灵活性和复用性。 2.分类&#xff1a; 插槽可以分为具名插槽和作用域插槽。 2.1具名插槽&#xff1a; 具名插槽允许父…

苹果macOS 14.4.1正式发布:修复无法使用外接显示器USB集线器问题

3 月 26 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.4.1 更新&#xff08;内部版本号&#xff1a;23E224&#xff09;&#xff0c;本次更新距离上次发布隔了 18 天。 需要注意的是&#xff0c;因苹果各区域节点服务器配置缓存问题&#xff0c;可能有些地方探测…

怎么在vscode里面保存图片视频音频文件(只需要两步)?

在硬盘中建立一个新的文件夹(自定义命名~我的这里是html→jpg) 第一步建立文件夹 第二步右键打开然后选择其他方式打开&#xff0c;选择code打开就会自己复制过去了

Memcached分布式内存对象数据库

一 Memcached 概念 Memcached 是一个高性能的分布式内存对象缓存系统&#xff0c;用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数&#xff0c;从而提高动态、数据库驱动网站的速度。 二 在架构中的位置 Memcached 处于前端或中间件后…

Gitea CORS Access-Control-Allow-Origin 的问题

最近我们在想使用我们提供的代码库进行元数据提供的时候&#xff0c;启动的服务报 CORS 问题。 如果你的 Gitea 服务器是直接暴露给外部使用的话&#xff0c;可以在 Gitea 的配置文件中添加下面的配置&#xff1a; [cors] ENABLED true ALLOW_DOMAIN *在完成上面的…

基于nodejs+vue网购平台管理系统python-flask-django-php

本篇论文对网购平台管理系统的需求分析、功能设计、系统设计进行了较为详尽的阐述&#xff0c;并对系统的整体设计进行了阐述&#xff0c;并对各功能的实现和主要功能进行了说明&#xff0c;并附上了相应的操作界面图。 前端技术&#xff1a;nodejsvueelementui, Express 框架…

Qt 作业 24/3/26

1、实现闹钟 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QLineEdit>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent …

Generating Permutations全排列

Problem generating all permutations of the numbers 1, 2, . . . , n. The first algorithm Idea 1[all the permutations of the numbers 2,3,…,n]&#xff0c; 2[all the permutations of the numbers 1,3,…,n]&#xff0c; ……&#xff0c; n[all the permutations of …

【Mybatis 基础】增删改查(@Insert, @Delete, @Update, @Select)

Mybatis Insert Delete Update Select Mybatis用法基础操作 - 删除delete 传参SpringbootMybatisCrudApplicationTests 测试类删除预编译SQL 基础操作 - 插入Insert 插入SpringbootMybatisCrudApplicationTests 测试类插入对象主键返回 基础操作 - 更新UPDATE 更新SpringbootMy…

k8s系列之十七 Istio中的服务治理

删除前面配置的目的地规则 [rootk8s-master ~]# kubectl delete destinationrule details destinationrule.networking.istio.io "details" deleted [rootk8s-master ~]# kubectl delete destinationrule productpage destinationrule.networking.istio.io "pr…

pdfjs 实现给定pdf数据切片高亮并且跳转

pdfjs 实现给定pdf数据切片高亮并且跳转 pdfjs 类的改写基本展示需求的实现高亮功能的实现查询功能分析切片数据处理 pdfjs 类的改写 需求&#xff1a; pdf文件被解析成多个分段&#xff0c;每个分段需要能够展示&#xff0c;并且通过点击分段实现源pdf内容的高亮以及跳转需求…

视频声音生成字幕 pr生成视频字幕 以及字幕乱码的解决

目录 目录 1、首先把要生成字幕的视频拖入以创建序列 2、点击工具栏的 窗口 选择 文本 3、选择字幕下的 转录序列 4、选择输出的语言&#xff08;主要看视频声音说的是啥语言&#xff09; 5、音轨 选择 音频1​编辑 6、点击转录 7、等待转录文本 8、点击创建说明性字幕按…

论文阅读笔记——Rethinking Pointer Reasoning in Symbolic Execution

文章目录 前言Rethinking Pointer Reasoning in Symbolic Execution12.1、基本情况概述12.2、摘要12.3、引言12.4、方法12.4.1、基本版本12.4.1.1、内存加载和存储12.4.1.2、状态合并 12.4.2、改进12.4.2.1、地址范围选择12.4.2.2、内存清理12.4.2.3、符号化的未初始化内存12.4…

卷起来——高级数据分析师

要成为一名高级数据分析师&#xff0c;需要掌握一系列的技能&#xff0c;包括数据处理、统计分析、机器学习、数据可视化以及业务理解等&#xff0c;喜欢或者想往这方面发展的童鞋们&#xff0c;卷起来&#xff0c;点击以下链接中的链接&#xff0c;备注"分析"进群交…