Java研学-SpringBoot(二)

二 Spring Boot 介绍

1 简介

  Spring Boot是由Pivotal团队提供的全新框架,主要目标是简化Spring应用程序的配置和部署过程,减少开发者在项目搭建和配置上的工作量,让开发者能够更专注于业务逻辑的实现。它使用特定的方式来进行配置,使开发人员不再需要定义样板化的配置,致力于在快速应用开发领域成为领导者。

2 特点

  简化的配置:采用约定优于配置的方式,通过自动化配置和默认设置来简化开发者的配置工作,减少了繁琐的配置代码。

  内嵌的Web容器:内置了多种常用的Web容器,如Tomcat、Jetty、Undertow等,使构建独立的Web应用程序变得更加简单。

  自动化依赖管理:通过提供一系列的“starter”依赖,自动管理应用程序的依赖关系,从而简化了依赖管理的工作。

  强大的开发者工具:提供了丰富的开发者工具,如热部署、自动重启、自动配置报告等,提高了开发效率。

  外部化配置:支持使用外部配置文件来配置应用程序的属性,如数据库连接、日志配置等,使应用程序的配置更加灵活和可管理。

  此外,Spring Boot还提供了健康检查和监控功能,可以监控应用程序的运行状态和性能指标,并确保应用程序在生产环境中的稳定性和可靠性。

  总体而言,Spring Boot使得开发者可以更快速、更便捷地构建和部署Java应用程序,提高开发效率和项目的可维护性。它适用于各种类型的应用程序,包括Web应用、RESTful服务、批处理作业等。如需更多关于Spring Boot的详细信息,可以查阅Spring Boot的官方文档或相关教程。

三 Spring Boot 入门

1 创建 Spring Boot 工程

  Spring Boot官方提供的工具来快速构建项目。IDEA 自带该功能,但需要联网使用。注意:官方提供的构建工具默认只能选择固定的版本,有些版本之间的差异非常大,所以如果需要选择某个版本可以自行在 pom.xml 文件中修改版本。
  官网创建
官网创建
  IDEA创建
IDEA创建
在这里插入图片描述

2 选定所需依赖

        <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>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

3 创建 HelloController

@Controller
@RequestMapping("hello")
public class HelloController {
    @RequestMapping
    @ResponseBody
    public String hello(){
        System.out.println("springboot!");
        return "springboot!";
    }
}

4 运行主启动类

  SpringBoot不需配置xml文件与tomcat也可以访问http://localhost:8080/,启动类其实本质也是一个配置类

@SpringBootApplication
public class BootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootDemoApplication .class, args);
    }
}

5 自动生成测试类

  测试类贴有 @SpringBootTest 注解,可以通过通过注解属性指定加载的配置类,若没有指定,默认加载的是贴 @SpringBootApplication 注解的配置类

@SpringBootTest
class BootDemoApplicationTests {
    @Autowired
    private MyDatasource myDatasource;
    @Test
    void test1() {
        System.out.println(myDatasource);
    }
}

6 父工程启动器

  springboot于pom中引用了父工程启动器,因为他的存在,导入大量的Maven依赖,简化开发,可通过追踪 spring-boot-starter-parent 到 spring-boot-dependencies 查看统一依赖版本管理(依赖传递)

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

7 阿里云脚手架

  阿里云提供的脚手架,使用方式相同,更换地址即可
官网
IDEA

8 手动创建 springboot

1. 创建Maven项目
2. 导入所需依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
3. 编写Controller
@Controller
public class HelloController {
    @RequestMapping("/hi")
    @ResponseBody
    public String hi() {
        return "Hi Spring Boot";
    }
}
4. 编写启动类 启动类位置必须在后台所有项目的同一级或上一级(扫描当前包以及子包)
@SpringBootApplication
// 该注解包含 @ComponentScan 进行扫描
// 该注解包含 @SpringBootConfiguration 中的 @Configuration 故为配置类
public class BootApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootApplication .class, args);
    }
}

9 父子工程

  Spring Boot 提供了一个名为 spring-boot-starter-parent 的工程,其中对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,解决依赖的版本问题,需要什么依赖,直接引入坐标即可
  继承是 Maven 中很强大的一种功能,继承使得子模块 pom 可以获得 parent 中的部分配置(groupId,version,dependencies,build,dependencyManagement 等),可以对子 pom 进行统一的配置和依赖管理。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
</parent>

  parent(继承:父工程标签) 项目中的 dependencyManagement 里的声明的依赖,只具有声明的作用,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom;另外若子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。
  parent 项目中的 dependencies 里声明的依赖会被所有的子项目继承。artifactId表示依赖的项目名称

  于项目中单击Module即可创建子工程,父工程的pom文件中会生成子模块的标签(告诉父亲儿子是谁)
在这里插入图片描述
在这里插入图片描述

 <!--当前父工程的所有子工程模块-->
  <modules>
    <module>child01</module>
    <module>child02</module>
  </modules>

  需在子工程pom中引入父工程标签,(告诉儿子父亲是谁),此后父工程引用的依赖,子工程也能够使用

 <!--设置当前模块的父工程-->
 <parent>
     <groupId>cn.tj</groupId>
     <artifactId>parent</artifactId>
     <version>1.0-SNAPSHOT</version>
 </parent>

  可通过dependencyManagement 标签,对子工程引用父工程依赖做限制,只让一部分子工程可以使用父工程中的依赖

<!--依赖管理:在父工程中定义需要子工程引用的所有依赖 及版本 可以给其做选择性的引入-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  子工程需声明父工程的依赖才能够使用

	<!--从父工程引入已经管理的依赖的时候不需要设置版本,因为父工程已经统一管理了版本-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
      </dependency>

10 启动器 Spring Boot Starter

  Spring Boot提供了很多以 spring-boot-starter-* 开头的 starter 启动器(依赖包),在使用 Spring Boot 来搭建一个项目时,只需要引入官方提供的 starter,就可以直接使用,免去了各种配置。(一个启动器中含有多个jar包)
  有关 Spring Boot Starter 命名规范,官方发布的 Starter 都遵循以下命名模式:spring-boot-starter-,其中 * 指特定的应用程序代号或名称。任何第三方提供的 Starter 都不能以 spring-boot 作为前缀,应该将应用程序代号或名称作为前缀,譬如 mybatis-spring-boot-starter。

spring-boot-starter:核心启动器,提供了自动配置,日志和 YAML 配置支持。

spring-boot-starter-aop:支持使用 Spring AOPAspectJ 进行切面编程。

spring-boot-starter-freemarker:支持使用 FreeMarker 视图构建 Web 应用。

spring-boot-starter-test:支持使用 JUnit,测试 Spring Boot 应用。

spring-boot-starter-web:支持使用 Spring MVC 构建 Web 应用,包括 RESTful 应用,使用 Tomcat 作为默认的嵌入式容器。

spring-boot-starter-actuator:支持使用 Spring Boot Actuator 提供生产级别的应用程序监控和管理功能。

spring-boot-starter-logging:提供了对日志的支持,默认使用 Logback

11 Web 启动器

  SpringBoot 提供的 Web 启动器,是一个快速集成 Web 模块的工具包,包含 Spring MVC,Jackson 相关的依赖,以及嵌入了 Tomcat9 服务器,默认端口 8080,Spring Boot 根据 spring-boot-starter-web 这个依赖自动引入,而且所有的版本都已经管理好,不会出现冲突。

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

12 打包独立运行

  Spring Boot 项目无论是普通应用还是 Web 应用,其打包方式都是 jar 即可(Web 应用也能打 war 包但需要额外添加许多插件)默认的 Maven 打包方式是不能正常的打包 Spring Boot 项目的,需要额外的引入打包插件,才能正常的对 Spring Boot 项目打包,以后只要拿到该 jar 包就能脱离 IDE 工具独立运行了。

<!-- pom.xml 中添加插件 -->
<build>
    <plugins>
        <!-- Spring Boot 打包插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<!-- 使用 maven 的 package 命令进行打包 -->
<!-- 使用命令 `java -jar xxx.jar` 运行 jar 包(--server.port=80)可更改端口号 -->

四 Spring Boot 参数配置

1 参数来源

  命令行启动项目时传入的参数,如:java -jar xxx.jar --server.port=80(改端口,默认8080);
  application.properties 或者 application.yml 文件,只有application开头的才是叶子图标
  自定义配置 properties 文件
  关于其中的参数配置都可以在官方文档中找到

2 application.properties

  若项目中properties与yml文件同时存在,properties优先级更高

server.port=80
server.session-timeout=30
server.tomcat.uri-encoding=UTF-8

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm
spring.datasource.username=root 
spring.datasource.password=admin

3 application.yml

  yml中的层级缩进代表父子关系,不能够随意删减,:后的空格也不能删

server:  
  port: 80
  session-timeout: 30  
  tomcat.uri-encoding: UTF-8  
  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/crm  
    username: root  
    password: admin  
    driverClassName: com.mysql.jdbc.Driver

4 配置优先级

  项目中可以有多个配置文件存放在不同目录中,此时会遵循固定的优先级来处理有冲突的属性配置,优先级由高到底,高优先级的配置会覆盖低优先级的配置。下面文件优先级由高到低排序为:

  • 项目/config/application.properties (项目目录下与src同级)
  • 项目/application.properties
  • classpath:config/application.properties (resources目录下)
  • classpath:application.properties (一般在这里做配置)

5 参数属性绑定 – 自定义 properties

 ① 参数配置在自定义的 properties,XML方式配置

# db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=admin
<!--自定义的 properties-->
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>

 ② JavaConfig 方式配置@PropertySource (等同上面的xml配置)+ @Value (通过key获取对应的值)从配置文件中获取数据

 // 生成配置类 自动加载 读取配置文件 获取其中的参数 创建Bean对象
@Configuration
@PropertySource("classpath:db.properties")/*替代原来读取外部配置文件的xml语句项目启动自动加载*/
public class SpringConfig {
    /*通过value注解取出db文件中key对应的value值该方法需要上面的读取外部配置文件语句配合*/
    @Value("${jdbc.driverClassName}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    /*Bean对象 MyDatasource 为实体类*/
    @Bean
    public MyDatasource myDatasource(){
        MyDatasource datasource=new MyDatasource();/*对象创建后是空值需要set赋值*/
        datasource.setDriverClassName(driver);
        datasource.setUrl(url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        return datasource;
    }
}

 ③ 实体类

public class MyDatasource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    @Override
    public String toString() {
        return "MyDatasource{" +
                "driverClassName='" + driverClassName + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

 ④ 单元测试查看是否获取成功

@SpringBootTest
class BootDemoApplicationTests {
    @Autowired
    private MyDatasource myDatasource;
    @Test
    void test1() {
        System.out.println(myDatasource);
    }
}

6 参数属性绑定 – application.properties

 ① application.properties 中设置参数

# application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=admin

 ② 获取数据

// 放入spring容器 省略上面的@Bean
@Component
public class MyDatasource {
    // 为参数赋值 直接从application.properties中获取
    //@Value("${jdbc.driverClassName}")
    private String driverClassName;
    //@Value("${jdbc.url}")
    private String url;
    //@Value("${jdbc.username}")
    private String username;
    //@Value("${jdbc.password}")
    private String password;

    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    @Override
    public String toString() {
        return "MyDatasource{" +
                "driverClassName='" + driverClassName + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

 ③ 批量获取数据 – @ConfigurationProperties 绑定对象属性
   可以把application.properties中参数的前缀编写到 @ConfigurationProperties 属性上,并且设置类属性与需要绑定的参数名相同,可实现自动绑定。
   若是使用测试类加载贴有 @Configuration 的配置类,则需要在配置类中添加@EnableConfigurationProperties 注解;若是使用测试类加载贴有 @SpringBootApplication 的配置类,则不需要。

// @ConfigurationProperties(prefix = "jdbc") 注解告诉 Spring Boot 从配置文件中查找以 jdbc为前缀的属性,并将它们绑定到这个类的字段上。
@Component  
@ConfigurationProperties(prefix = "jdbc") 
public class MyDatasource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    @Override
    public String toString() {
        return "MyDatasource{" +
                "driverClassName='" + driverClassName + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

   要启用配置属性的自动绑定,需要在 Spring Boot 的主类或配置类上添加 @EnableConfigurationProperties 注解,并传入你的属性类的 Class 对象。但在上述示例中,已经使用了 @Component,所以这一步是可选的。Spring Boot 会自动发现并绑定标记为 @Component 的 @ConfigurationProperties 类。

7 Environment 对象绑定属性

   当要绑定的参数过多时,直接在配置类中注入 Spring 的 Environment 对象, 这样就不需要贴上在字段或者形参上太多的 @Value 注解。从 Environment 对象中可以获取到 application.properties 里面的参数,也可以获取到 @PropertySource 中的参数(但 application.properties 的优先级比 @PropertySource 高)

@Configuration
public class SpringConfigEnv {
    /*内置对象 继承了属性解析器*/
    @Autowired
    private Environment environment;
    @Bean
    public MyDatasource myDatasource(){
        MyDatasource datasource=new MyDatasource();
        // 通过environment对象获取key对应的参数
        datasource.setDriverClassName(environment.getProperty("jdbc.driverClassName"));
        datasource.setUrl(environment.getProperty("jdbc.url"));
        datasource.setUsername(environment.getProperty("jdbc.username"));
        datasource.setPassword(environment.getProperty("jdbc.password"));
        return datasource;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

软件高级:软件产品线-双生命周期模型概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

unity学习(70)——编译游戏发生错误1

要命 1.VersionControl 直接注释掉就可以了。一共有5处。 2. GraphView一处&#xff0c;也是注释掉就ok了 3.修改完以上6处后66s完成编译 4. 编译结果如下图所示 5. unity中成功实例化两个对象&#xff0c;但此时服务器炸了&#xff01; 6.预构体数组越界 把naruto模型再往里面…

[网鼎杯 2018]Comment -----不会编程的崽

网鼎杯的题啊&#xff0c;每次都能记忆犹新&#xff0c;又get到了不少。 这种发帖的界面在ctf中不少见了&#xff0c;多半是二次注入。但是这个二次注入并不单纯。在一道大坎之前&#xff0c;必定存在小坎。这不&#xff0c;先登录。 先别急着怀疑是否为其他漏洞。仔细观察&…

EasyPOI操作Excel从零入门

教程介绍 我们不造轮子&#xff0c;只是轮子的搬运工。&#xff08;其实最好是造轮子&#xff0c;造比别人好的轮子&#xff09;开发中经常会遇到excel的处理&#xff0c;导入导出解析等等&#xff0c;java中比较流行的用poi&#xff0c;但是每次都要写大段工具类来搞定这事儿…

网络协议栈--网络层--IP协议

目录 本节重点网络层IP协议一、 基本概念二、 IP协议报头格式三、网段划分(重要)四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、IP协议全部内容一览图 本节重点 1、理解网络层的作用, 深入理解IP协议的基本原理 2、对整个TCP/IP协议有系统的理解…

SQLiteC/C++接口详细介绍sqlite3_stmt类(八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;九&#xff09; 27、sqlite3_column_int 函数 sqlite3_column_int 用于返…

吴恩达2022机器学习专项课程(一) 3.5 可视化成本函数

问题预览 为什么要可视化成本函数&#xff1f;可视化之后的成本函数是什么样子&#xff1f;如何在三维空间里通过w和b找到一个成本函数的值&#xff1f;如何在三维空间里找到成本函数的最小值&#xff1f; 解读 可视化成本函数&#xff1a;为了更加方便的看到不同的w和b&…

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表&#xff08;级联样式表&#xff09;&#xff0c;主要用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距等&#xff09;以及…

再仔细品品Elasticsearch的向量检索

我在es一开始有向量检索&#xff0c;就开始关注这方面内容了。特别是在8.X之后的版本&#xff0c;更是如此。我也已经把它应用在亿级的生产环境中&#xff0c;用于多模态检索和语义检索&#xff0c;以及RAG相关。 也做过很多的优化&#xff1a;ES 8.x 向量检索性能测试 & 把…

Vue2谷粒商城

1.初始化项目 npm init -y 2. 安装vue 2 npm install vue^2 3.编写基本代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

构建以太网交换网络——(生成树实验)

实验介绍 关于本实验 以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至…

PB 级速度,单一数据库操作:走进 Amazon Aurora Limitless Database 的神奇

在数字时代的浪潮中&#xff0c;数据库管理面临着前所未有的挑战和复杂性。对于许多应用程序开发者而言&#xff0c;维护数据库、确保一致性保证、执行升级和备份等日常操作变得越来越复杂。随着应用程序规模的不断扩大&#xff0c;这些任务可能变得琐碎而繁重。传统的数据库管…

前端Webpack5高级进阶课程

课程介绍 本套视频教程主要内容包含React/Vue最新版本脚手架分析、基于Webpack5编写自己的loader和plugin等&#xff0c;让你开发时选择更多样&#xff0c;最后&#xff0c;用不到一百行的代码实现Webpack打包。通过本套视频教程的学习&#xff0c;可以帮你彻底打通Webpack的任…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

多模态检索增强生成的简单介绍

原文地址&#xff1a;An Easy Introduction to Multimodal Retrieval Augmented Generation 2024 年 3 月 20 日 如果检索增强生成(RAG) 应用程序可以处理多种数据类型&#xff08;表格、图形、图表和图表&#xff09;而不仅仅是文本&#xff0c;那么它的实用性就会呈指数级…

2023年全国职业院校技能大赛(网络系统管理赛项)样题三

2023****年全国职业院校技能大赛 GZ073****网络系统管理赛项 赛题第3套 模块A&#xff1a;网络构建 ​ 目 录 任务清单… 1 &#xff08;一&#xff09;基础配置… 1 &#xff08;二&#xff09;有线网络配置… 1 &#xff08;三&#xff09;无线网络配置… 3 &#…

华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、七日集训第 3 期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、矩阵第4天、深度优先搜索dfs算法第5天、回溯法第6天、二分查找第7天、正则表达式 大家好&#xff0c;我是…

5个适用于 Windows/PC 的水印去除软件(视频/图像)

水印是文本、徽标、印记、图像或签名&#xff0c;通常叠加在视频、其他图像或具有较高透明度的 PDF 文档上。当您免费使用某些产品&#xff08;例如视频编辑器&#xff09;时&#xff0c;最终输出通常带有代表您使用的编辑器的水印。您可能需要出于您的目的从此类媒体文件中删除…