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.rhkb.cn/news/287593.html

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

相关文章

PSA制氧装置的工作原理及应用解析

PSA制氧装置&#xff0c;即变压吸附制氧装置&#xff0c;是一种广泛应用于工业生产与其他领域的重要设备。该装置基于吸附剂在不同压力下对气体分子吸附能力的差异&#xff0c;通过周期性压力变化来实现氧气的分离与提纯。 工作原理 PSA制氧装置的工作原理主要基于物理吸附与解…

【ESP32S3 Sense接入百度在线语音识别】

视频地址&#xff1a; ESP32S3 Sense接入百度在线语音识别 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入百度智能云实现在线语音识别。自带麦克风模块用做语音输入&#xff0c;通过串口发送字符“1”来控制数据的采集和上传。 步骤概括    (1) 在百度云控制端选择“语音…

JVM(三)——字节码技术

三、字节码技术 1、类文件结构 一个简单的 HelloWorld.java package com.mysite.jvm.t5; // HelloWorld 示例 public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }执行 javac -parameters -d . HellowWorld.…

会员中心微服务

文章目录 1.环境配置1.创建会员中心模块2.检查父子模块的pom.xml1.父模块注意&#xff1a;如果父模块中的依赖显示not found&#xff0c;原因是子模块并没有引用&#xff0c;不用在意 2.子模块 3.pom.xml 引入相关依赖&#xff08;别忘记刷新maven&#xff09;4.application.ym…

机器学习预测气候变化对产量的影响

通过机器学习预测作物产量 今天分享一篇文献解读&#xff0c;将围绕论文《结合机器学习和环境变量约束气候变化下作物产量变化预测的不确定性》展开,该研究通过将动态线性模型(DLM)和随机森林机器学习模型(RF)分别与9个全球网格作物模型(GGCM)集成来整合和克服这两种建模框架的…

webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面&#xff0c;准备工作 vue webpack就自己弄了&#xff0c;webpack的一些配置也自己配置好 一、创建index.css文件 .box{width: 100px;height: 100px;background-color: red; }然后在vue的main.js文件中引入它 二、创建自定义l…

jmeter二次开发发送java请求_保姆级教程!!!

一、引言 JMeter是Apache基金会开发的一款开源性能测试工具,广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试,以评估应用程序的性能和稳定性。然而,在实际使用过程中,用户可能会遇到需要发送Java请求的场景,例如测试Java Web应用程序或其他…

【Monero】Wallet RPC | Wallet CLI | 门罗币命令行查询余额、种子、地址等命令方法教程

ubuntu22.04 首先在运行daemon&#xff0c;详细安装运行教程可参考&#xff1a;The Monero daemon (monerod) ./monerodWallet CLI run ./monero-wallet-cli如果还没有钱包就根据提示创建钱包即可 输入密码 查询余额 balance查询种子 seed其他可执行命令操作&#xff1…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

前言&#xff1a;总算是调测通了 话接上回&#xff0c;车牌识别摄像头买回来了&#xff0c;卡在电源上了&#xff0c;今天抽时间把电源问题解决了&#xff0c;开始代码正式的调测。一切还算顺利了&#xff0c;没有再碰到打脸的事情了。 一、电源接线&#xff1a; 如同前面预想的…

selenium元素定位--xpath定位--层级与逻辑组合定位

其他元素非唯一时&#xff0c;又不想用xpath绝对定位时&#xff0c;需要用到层级与逻辑定位. 一、层级属性结合定位&#xff1a; 遇到元素没有class、name、id等或属性动态变化情况时&#xff0c;可以找父节点元素&#xff0c;父级节点没有id时&#xff0c;可以继续往上找id&…

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…

UE5 C++ 3D血条 响应人物受伤 案例

一.3Dwidget 1.创建C Userwidget的 MyHealthWidget&#xff0c;声明当前血量和最大血量 UCLASS() class PRACTICEC_API UMyHealthWidget : public UUserWidget {GENERATED_BODY() public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float C…

Ubuntu连不上外网的问题—ping不通baidu.com

一、问题 虚拟机不能联网&#xff0c;ping百度时候出现这个问题 book100ask:~$ ping www.baidu.com ping: www.baidu.com: Name or service not known 二、解决办法 首先&#xff0c;定位问题&#xff0c;再问我出现的问题中&#xff0c;认为是NAT设置的问题&#xff0c;只要…

【Frida】【Android】02_JAVA层HOOK

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

matlab编译成jar包

1、输入deploytool命令 2、选择Library Compiler 3、配置打包 4、有效文件 5、java函数调用 package com.beescloud.frame.matlab;import com.mathworks.toolbox.javabuilder.MWException; import test.Class1;public class MatlabTest {public static void main(String[] arg…

PanTools v1.0.17 多网盘批量管理 批量分享、转存、复制...

软件介绍 一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有…

UI风格汇:卡通风格(Cartoon Style),极具辨识度的风格

一、卡通风格的特点 卡通风格是一种在UI设计中常见的设计风格&#xff0c;它以卡通或漫画的形式呈现&#xff0c;具有夸张、可爱、幽默和生动的特点。卡通风格的UI设计通常使用明亮的色彩、简化的图形和夸张的表情来表达信息和情感。 以下是卡通风格在UI设计中的一些特点&…

【数字图像处理】改变图像灰度级别

改变图像灰度级别 首先&#xff0c;对原始图像 O O O进行灰度级量化: q int ⁡ ( O 2 i ) 2 i , q\operatorname{int}\left(\frac{O}{2^{i}}\right) \times 2^{i}, qint(2iO​)2i, 灰度级别256&#xff0c;128&#xff0c;64&#xff0c;32&#xff0c;16&#xff0c;8&…

是德科技KEYSIGHT MSOX2024A混合信号示波器

181/2461/8938产品概述&#xff1a; Keysight MSOX2024A 提供适合您预算的入门级价位&#xff0c;以及同类任何其他示波器所不具备的卓越性能和可选功能。凭借是德科技设计的 MegaZoom IV 定制 ASIC 技术&#xff0c;它每秒可提供高达 200,000 个波形。通过这种速度&#xff0…

Typescript语法总结

#Typescript 解决了什么问题 Typescript本质上是在 JavaScript 上增加一套静态类型系统&#xff08;编译时进行类型分析&#xff09;&#xff0c;强调静态类型系统是为了和运行时的类型检查机制做区分&#xff0c;TypeScript 的代码最终会被编译为 JavaScript。 Typescript 创造…