Java Gradle

news2024/11/27 14:41:41

目录

1. Gradle简介

1.1 什么是Gradle

1.2 Gradle优点

1.2.1 自动化构建

1.2.2 Gradle相当于构建工具的进化版

1.2.3 对于Gradle优点,官网是这么说的

1.3 Grade 的版本说明

2. Groovy语言基础

2.1 基础语法

2.2 String 与 GString

2.2.1 String

2.2.2 插值字符串 GString

 2.3 方法

2.4 逻辑控制

2.4.1 switch/case 语句

2.4.2 for循环

2.5 闭包

2.6 IO操作

2.6.1 文件读取

 2.6.2 文件写入

2.7 数据结构

2.7.1 列表

 2.7.2 范围

 2.7.3 映射

2.8 小结

3. Gradle配置详解

3.1 SpringBoot项目结构

3.2 build.gradle

3.2.2 插件-plugins

3.2.3 仓库-repositories

3.2.4 依赖-dependencies

3.2.5 依赖管理-dependencyManagement

3.3 settings.gradle

 3.4 gradle流程

4. Gradle Wrapper详解

4.1 什么是Gradle Wrapper

4.2 配置Gradle Wrapper


1. Gradle简介

1.1 什么是Gradle

今天来学一学Gradle,相比于之前的Maven,现在Gradle可是大名鼎鼎。同样都是项目构建工具,Gradle有什么独特之处?Gradle官网中是这样介绍的

Gradle is an open-source build automation tool focused on flexibility and performance. Gradle build scripts are written using a Groovy or Kotlin DSL. —官网

翻译成中文就是,Gradle 是专注于灵活性性能的开源构建自动化工具。Gradle 构建脚本是使用 Groovy 或 Kotlin DSL 编写的。 

Groovy和DSL都是小语言,用来专门解决某一类任务。

1.2 Gradle优点

1.2.1 自动化构建

就是许多操作自动化嘛,Maven也行,是一项老技术了。就像写 Java 的时候,如果没有构建工具,我们需要在控制台,通过javac先将 Java 文件编译为 class 文件,然后再用jar命令将 class 文件打包为 jar 包。有了自动化构建工具只需要一个命令或是点一个按钮就可以打出 jar包。

1.2.2 Gradle相当于构建工具的进化版

  • Apache Ant:最初是用来构建Tomcat的,发布于2000,用Java编写,构建脚本是xml。早期用Eclipse开发时,就用Ant。有比较多的缺点:无法实时获取运行信息,对xml没有规定约束,项目比较大时,xml难维护。
  • Maven:2004年推出Maven,解决上述问题。构建工具也是xml,相比Ant提供了高级项目管理工具。缺点也有:xml长,不好维护;灵活性不好;连接仓库不方便。
  • Gradle:采用Groovy或Kotlin编写,汲取Ant与Maven优点。最初用于Android,现在在Java开发中也广泛应用。

1.2.3 对于Gradle优点,官网是这么说的

Accelerate developer productivity

翻译过来就是:加快开发人员生产力

From mobile apps to microservices, from small startups to big enterprises, Gradle helps teams build, automate and deliver better software, faster.

翻译过来就是:从移动应用程序到微服务,从小型初创公司到大型企业,Gradle 可以帮助团队更快地构建,自动化和交付更好的软件。

Gradle 它汲取了 Ant 和 Maven 的优点,吸收了 Ant 的 task 思想,和 Maven 的规范化和仓库概念。采用 Groovy 或是 Kotlin 语言编写,但是它的代码量更少,可读性更强

Gradle 具有以下 3 大特性:

  • 高度可定制: 它的高度可定制化体现在,它以最基本的方式可定制和可扩展的方式建模;
  • 快速 : Gradle 通过重新使用以前执行的输出,仅处理已更改的输入以及并行执行任务来快速完成任务。通俗点就是说,第二次构建,只构建我们修改代码相关的类,不会耗费时间来构建整个项目;
  • 强大 : Gradle 是 Android 的官方构建工具,并支持许多流行的语言和技术。

 

1.3 Grade 的版本说明

  • V2.2.1 - 4.10.1 : 基本已经很少使用了;
  • V4.10.1: AndroidStudio 3.3.0 支持的最低 Gradle 版本;
  • V5.0 : Gradle 的一个比较里程碑的版本,这个版本支持了 Kotlin DSL;
  • V6.0.1: 目前使用较多的版本;
  • V6.1.1: 目前最新的版本,2020 年 1 月 15 日发布的。主要是改进了依赖关系管理中的功能集。

2. Groovy语言基础

Gradle 是一个构建工具,它的构建脚本是基于 Groovy 或是 Kotlin 语言编写的。

Groovy 结合了 Java、Python、Ruby 等当下几大流行语言的优点。它可以说是从 Java 中衍生出来的,为什么这么说呢?因为它的语法和 Java 非常的相似,它的文件也是可以编译为 .class 文件,而且可以使用 Java 的类库。

2.1 基础语法

变量:def

引入包:和Java一样

Tips:在开发 Groovy 时,以下一些库,我们不需要显式的去引入它们,系统已经包含了这些库。

import java.lang.*
import java.util.*
import java.io.*
import java.net.*

import groovy.lang.*
import groovy.util.*

import java.math.BigInteger
import java.math.BigDecimal

注释和分号:和Java一样

关键字:

大差不差

asassertbreakcaseenumextends
catchclassconstcontinuefalseFinally
defdefaultdoelseforgoto
importininstanceofinterfaceifimplements
newpullpackagereturnthrowstrait
superswitchthisthrowtruetry
while

2.2 String 与 GString

2.2.1 String

在 Java 中我们用单引号(’’)来表示 char,用双引号("")表示字符串。但是在 Groovy 中字符串不仅可以用双引号 (""),而且单引号 (’’),三引号 ("’’")也可以。 

class Example { 
   static void main(String[] args) { 
      String a = '单引号'; 
      String b = "双引号"; 
      String c = '''这是三引号 
    Gradle专题
    Groovy语言基础''';
      println(a); 
      println(b); 
      println(c); 
   } 
}

输出结果 

单引号
双引号
这是三引号 
    Gradle专题
    Groovy语言基础
 

我们发现三引号(’’’ ‘’’)其实还可以换行,多行字符串也可以用三引号(’’’ ‘’’)来引用。不像 Java 一样我们如果字符串换行还需要用“ + 和 \n”连接起来。

2.2.2 插值字符串 GString

所谓插值,就是用 ${变量名}读取该变量的值,而拼接起来的字符串。

class Example { 
   static void main(String[] args) { 
      def a = 'Gradle专题'; 
      def b = "${a} Groovy语言基础"; //插值字符串 GStringImpl
      println(a.class); 
      println(b.class); 
      println(b); 
   } 
}

class java.lang.String
class org.codehaus.groovy.runtime.GStringImpl
Gradle专题 Groovy语言基础 

 2.3 方法

Groovy 的方法定义跟 Java 比较类似,它的返回类型可以用返回值的类型或是def定义,也可以使用 publicstatic,private等修饰。

注意:方法不要定义在 main 方法里面。

2.4 逻辑控制

  • 顺序执行: 就是按顺序一步步执行。
  • 条件判断: 这个就是我们 Java 中的if/elseswitch/case
  • 循环语句: 跟 Java 中一样还是whilefor.

Tips: 虽然 Groovy 的逻辑控制和 Java 中是一样的,但是 Groovy 又扩展了一些新功能。其中条件语句的if/else和循环语句的while与 Java 中是一样的,但是条件语句的switch/case和循环语句中的for, Groovy 在 Java 的基础上做了扩展。

2.4.1 switch/case 语句

class Example { 
   static void main(String[] args) { 
    def x = 0.98
    //def x = 3
    def result
    switch (x){
    case [4,5,6,'Gradle']:   //列表
        result = 'list'
        break
    case 3..11:
        result = 'range'     //范围
        break
    case Integer:
        result = 'Integer'   //类型
        break
    case BigDecimal:
        result = 'BigDecimal'//类型
        break
    default:
        result = 'default'
        break
    }
    println(result)
   };
}

//x = 0.98时输出结果为
BigDecimal
//x = 3时输出结果为
range 

 相较于 Java 的switch/case,Groovy 它的判断类型可以是任何类型。

2.4.2 for循环

Groovy 除了支持 Java 的for(int i = 0;i < length;i++)for(int i :array)形式的循环语句,还支持以下形式的循环语句:

class Example { 
   static void main(String[] args) { 
//1 对范围的for循环
def sum = 0
for (i in 0..100){
    sum += i
}
println("0到100的和为:"+sum)
//2 对List的循环
def sumList = 0;
for (i in [1,2,3,4,5,6,7,8,9,10]){
    sumList += i
}
println("0到10的和为:"+sumList)
//3 对Map的循环
def sumMap = 0
for (i in ['张三':21,'李四':25,'王五':36]){
    sumMap += i.value
    println i.key
}
println("他们的年龄和为:"+sumMap)
   };
}

0到100的和为:5050
0到10的和为:55
张三
李四
王五
他们的年龄和为:82

2.5 闭包

闭包就是一段用 {} 包起来的代码块,使用方法和方法类型,可以命名,可以传参,可以被调用。

class Example { 
   static void main(String[] args) { 
//1 定义一个闭包
def closer = {
    println "Gradle专题之Groovy语法"
}

//2 闭包的两种调用方式
closer.call()
closer()
   };
}

 建议大家使用第一种方式去调用,以免和方法的调用混淆。

上面定义的是无参的闭包,下面我们定义一个传参的闭包:

class Example { 
   static void main(String[] args) { 
//1 定义一个传参的闭包
def closer = {
   String name -> println "${name}专题之Groovy语法"
}

closer.call('Gradle')
   };
}

2.6 IO操作

2.6.1 文件读取

class Example { 
   static void main(String[] args) { 
        def filePath = "D:/groovy.txt"
        def file = new File(filePath)
        file.eachLine {
            println it
        }
   };
}

----------或是我们也可以像下面这么简洁---------
class Example { 
   static void main(String[] args) { 
        def filePath = "D:/groovy.txt"
        def file = new File(filePath)
        println file.text
    };
}

 2.6.2 文件写入

class Example { 
   static void main(String[] args) { 
        def filePath = "D:/groovy.txt"
        def file = new File(filePath)
        file.withPrintWriter {
            it.println("Gradle专题")
            it.println("Groovy语言")
            it.println("文件写入")
        }
   };
}

2.7 数据结构

常用的主要有:列表,范围,映射。跟 Java 的数据结构比较类似。

2.7.1 列表

class Example { 
   static void main(String[] args) { 
// Java的定义方式
    def list = new ArrayList() //定义一个空的列表
//groovy中定义
    def list2 = []          //定义一个空的列表
    def list3 = [1,2,3,4]   //定义一个非空的列表

    println list2.class
    println list3.class
   };
}
--------------输出----------------
class java.util.ArrayList
class java.util.ArrayList

----------------------------------

数组:

//在groovy中使用as关键字定义数组
def array = [1,2,3,4] as int[]
//或者使用强类型的定义方式
int[] array2 = [1,2,3]

 2.7.2 范围

class Example { 
   static void main(String[] args) { 
   //范围的定义
    def range = 1..15

    //范围的使用
     //第一个元素的值
    println ("第一个元素的值:"+range[0])
    //是否包含8
    println ("是否包含8 "+range.contains(8))
    //范围的起始值   
    println ("范围的起始值:"+range.from)
    //范围的结束值
    println ("范围的结束值:"+range.to )
      };
}

--------------输出----------------
第一个元素的值:1
是否包含8 true
范围的起始值:1
范围的结束值:15

----------------------------------

 2.7.3 映射

在 Groovy 中定义映射 (MAP) 和 List 类似使用[]并且要指明它的键 (key)和值 (value),默认的实现类为java.util.LinkedHashMap.

class Example { 
   static void main(String[] args) { 
   //1 映射的定义
    def swordsman = [one:'张三丰',two:'金毛狮王谢逊',three:'张无忌']

    //2 映射的使用
    println swordsman['one']
    println swordsman.get('two')
    println swordsman.three

    //3 添加元素
    swordsman.four = '成坤'
    println swordsman

    //4 groovy中,可以添加一个复杂的元素,比如添加一个map
    swordsman.five = [a:1,b:2]
    println swordsman
   };
}

------------------输出----------------------
张三丰
金毛狮王谢逊
张无忌
[one:张三丰, two:金毛狮王谢逊, three:张无忌, four:成坤]
[one:张三丰, two:金毛狮王谢逊, three:张无忌, four:成坤, five:[a:1, b:2]]
--------------------------------------------

2.8 小结

  • Groovy 的语法和 Java 非常相似;
  • Groovy 中定义变量可以使用def系统会自动帮我们转换为具体类型;
  • 定义基本数据类型时不需要导包,Groovy 系统包含那些包;
  • Groovy 的字符串可以用,单引号,双引号,三引号。换可以支持字符串的插值;
  • Groovy 的方法跟 Java 一样不能定义在方法内部;
  • Groovy 的switch/case支持任意类型的判断;
  • Groovy 的for支持列表,范围和映射的遍历;
  • Groovy 的闭包灵活且强大建议使用第一种方式调用;
  • Groovy 的数组使用as关键字定义;
  • Groovy 的映射必须指明键和值。

3. Gradle配置详解

3.1 SpringBoot项目结构

 

  1. 根目录下的 build.gradle: 顶级构建文件,配置 Gradle 版本和 Maven 依赖;
  2. 各个模块下的 build.gralde: 该模块打包和签名配置,及模块的依赖;
  3. gradle 文件夹: 配置 gradel-wrapper;
  4. setting.gradle 文件: 添加编译的所有模块;
  5. gradle.properties 文件: 项目范围的梯度设置,编译内存,Gradle 并发性等设置。;
  6. gradlew 和 gradlew.bat 文件: Gradle 启动脚本文件;
  7. .gradle 文件夹: 编译时的缓存文件夹。

重点学习下build.gradlesetting.gradle

3.2 build.gradle

需要注意的是,脚本内容的执行是有先后顺序的,一般来说按buildscript->plugins->repositories->dependencies->dependencyManagement。

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.4.5'
    }
}

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.zkcloud'
version = '1.0.0'

repositories {
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
}

ext {
    set('springCloudVersion', "2020.0.2")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'com.github.ben-manes.caffeine:caffeine:2.8.8'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

3.2.1 构建脚本-buildscript

buildscript {
    repositories {
        /*从哪儿下构建插件*/
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
    }
    dependencies {
        /*下什么构建插件*/
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.4.5'
    }
}

 其中:repositories指定仓库的位置,dependencies指定了插件类型和版本

3.2.2 插件-plugins

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

id 'org.springframework.boot' 引入了springboot插件,可执行springboot项目相关的task指令

id 'io.spring.dependency-management' 引入了依赖管理相关的插件,可执行依赖相关的指令

id 'java' 引入了Java插件,就可以支持java编译、运行、打包等task指令

3.2.3 仓库-repositories

repositories {
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
}

用于指定项目中的Jar包依赖,需要从哪里下载,由于各种各样的原因,我们需要改成国内的镜像

比如,阿里的镜像 :maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }

3.2.4 依赖-dependencies

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-config'
    implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'com.baomidou:mybatis-plus-boot-starter:3.1.0'
    implementation 'com.alibaba:druid-spring-boot-starter:1.1.9'
    implementation 'org.apache.commons:commons-pool2'
    implementation 'mysql:mysql-connector-java'
}

显然,是项目中引入外部依赖的关键,类比于maven,可以发现是类似的

implementation 是springboot插件提供的task指令,指定作用域为:从编译、打包到运行的整个过程都有效,类似于maven的scope节点

可以用 groupId artifactId version 指定一个具体依赖

implementation groupId 'com.baomidou' artifactId 'mybatis-plus-boot-starter' version '3.1.0'

也可以用

implementation 'com.baomidou:mybatis-plus-boot-starter:3.1.0' 

3.2.5 依赖管理-dependencyManagement

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

这一块主要是依赖管理相关,如果这涉及到,多模块、父子模块,那么在这里,可以界定,全局的依赖版本,记住一点的是,这个地方并不会引入依赖,指定提前界定好,那么在各模块中就不用写版本号了,比如前面说的dependencies里面的依赖,和springboot“同宗同族”的,基本上都没有指定版本,就是因为这里已经指定了springboot的版本,方便依赖的版本管理。

3.3 settings.gradle

settings.gradle是模块Module配置文件,主要是用于配置子模块,根目录下的setting.gradle脚本文件是针对module的全局配置

// 为指定父模块的名称 平台根
rootProject.name = 'project-root'
//包含子系统以及模块
include ':project-core'
//Hello系统模块的加载
include ':project-hello'
//World系统模块的加载
include ':project-world'

 3.4 gradle流程

初始化阶段

首先解析settings.gradle

Configration阶段:

解析每个Project中的build.gradle,解析过程中并不会执行各个build.gradle中的task

经过Configration阶段,Project之间及内部Task之间的关系就确定了。一个 Project 包含很多 Task,每个 Task 之间有依赖关系。

Configuration会建立一个有向图来描述 Task 之间的依赖关系,所有Project配置完成后,会有一个回调project.afterEvaluate,表示所有的模块都已经配置完了。

4. Gradle Wrapper详解

4.1 什么是Gradle Wrapper

The recommended way to execute any Gradle build is with the help of the Gradle Wrapper (in short just “Wrapper”). The Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary. As a result, developers can get up and running with a Gradle project quickly without having to follow manual installation processes saving your company time and money.—官方

我们翻译过来大致意思就是:官方建议任何 Gradle 构建方法在 Gradle Wrapper 帮助下运行。Gradle Wrapper 它是一个脚本,调用了已经声明的 Gradle 版本,并且我们编译时需要事先下载它。所以,开发者能够快速的启动并且运行 Gradle 项目,不用再手动安装,从而节省了时间成本。

我们可以称 Gradle Wrapper 为 Gradle 包装器,是将 Gradle 再次包装。让所有的 Gradle 构建方法在 Gradle 包装器的帮助下运行。

使用Gradle Wrapper的好处就是方便项目共同开发与管理,在Wrapper中定义好Gradle版本,这样本地没有Gradle也可以来构建项目。

4.2 配置Gradle Wrapper

gradle-wrapper.properties文件指明了 Gradle 的版本号,和 Gradle 运行时的行为属性文件。下面我们具体看下这个文件的内容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

  1. distributionBase: Gradle 解包后存储的父目录;
  2. distributionPath: distributionBase指定目录的子目录。distributionBase+distributionPath就是 Gradle 解包后的存放的具体目录;
  3. distributionUrl: Gradle 指定版本的压缩包下载地址;
  4. zipStoreBase: Gradle 压缩包下载后存储父目录;
  5. zipStorePath: zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是 Gradle 压缩包的存放位置。

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

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

相关文章

最新SSL证书申请源码,支持API接口,支付在线充值

最新SSL证书申请源码&#xff0c;支持API接口&#xff0c;支付在线充值 目前测试还不需要授权&#xff0c;以后更新版就不知道了 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL证书系统 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;…

Nacos内核设计之一致性协议(上)

Nacos一致性协议 Nacos技术架构 先简单介绍下Nacos的技术架构 从而对nacos有一个整体的认识 如图Nacos架构分为四层 用户层、应用层、核心层、各种插件 再深入分析下nacos一致性协议的发展过程及原理实现 为什么nacos需要一致性协议 Nacos是一个需要存储数据的一个组件 为了实…

4k、VR与万兆光网

“全光万兆”对VR意义重大。 pico4的分辨率 PICO 4 的单眼分辨率是 2160 2160&#xff0c;整体分辨率高达 4320 2160。这是一款高性能的 VR 一体机&#xff0c;采用了 2.56 英寸的 Fast-LCD 屏幕&#xff0c;最高可实现 90Hz 刷新率&#xff0c;还有 1200 PPI 和 20.6 PPD 的…

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代&#xff0c;当我们的手机还没有触摸屏&#xff0c;游戏也只有像“贪食蛇”这样的经典款&#xff1f;当时&#xff0c;许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今&#xff0c;让我们利用Python和Tkinter&#xff0c;一起重温那个时代&#xff0c;制作…

多平台兼容性:跑腿系统开发的移动端和Web端技术选项

随着移动设备和Web浏览器的广泛使用&#xff0c;跑腿系统的开发需要考虑多平台兼容性。本文将讨论一些在开发跑腿系统的移动端和Web端时可用的技术选项&#xff0c;并提供示例代码以帮助您入门。 移动端技术选项&#xff1a; 1. React Native React Native是一个流行的移动应…

Linux shell编程学习笔记1:关于shell的前世今生

一、什么是Shell&#xff1f; Shell英文单词的原意是“外壳”&#xff0c;在计算机领域专指在操作系统&#xff08;Operating System&#xff09;外层&#xff0c;提供用户界面&#xff08;User Interface&#xff09;的程序&#xff0c;主要负责将用户的命令&#xff08;Comma…

优彩云采集器下载-免费优彩云采集器下载地址

免费优彩云采集器。您是否曾为了数据采集而感到头疼不已&#xff1f;是否一直在寻找一种能够轻松、高效地获取所需数据的方法&#xff1f;别着急&#xff0c;让我们一起来了解如何通过优彩云采集器解决这些问题&#xff0c;从而让您产生购买的欲望。 免费全自动采集发布批量管理…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介&#xff1a; 辭七七&#xf…

【Elsevier旗下】1区(TOP)、CCF推荐,仅2个月左右录用!

计算机领域 • 新刊速递 出版社&#xff1a;Elsevier 影响因子&#xff08;2022&#xff09;&#xff1a;8.0-9.0 期刊分区&#xff1a;JCR1区&#xff0c;中科院2区&#xff08;TOP&#xff09; 检索数据库&#xff1a;SCIE&EI 双检 数据库检索年份&#xff1a;1992年…

客户端和服务端信息交互模型

什么是客户端和服务端&#xff1f; 客户端&#xff1a;可以向服务器发请求&#xff0c;并接收返回的内容进行处理 服务器端&#xff1a;能够接收客户端请求&#xff0c;并且把相关资源信息返回给客户端的 当用户在地址栏中输入网址&#xff0c;到最后看到页面&#xff0c;中间都…

魔众题库系统 v8.8.0 公式编辑升级,注册站内信和邮件,手机Banner支持视频背景

魔众题库系统基于PHP开发&#xff0c;可以用于题库管理和试卷生成软件&#xff0c;拥有极简界面和强大的功能&#xff0c;用户遍及全国各行各业。 魔众题库系统发布v8.8.0版本&#xff0c;新功能和Bug修复累计23项&#xff0c;公式编辑升级&#xff0c;注册站内信和邮件&#…

【文末送书】计算机网络编程 | epoll详解

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

解析ASEMI代理瑞萨R7S721031VCFP#AA1芯片及其优势

编辑-Z 在无数种芯片中&#xff0c;R7S721031VCFP#AA1芯片以其独特的性能和优势&#xff0c;脱颖而出&#xff0c;成为许多原创硬件开发人员的首选。本文将从各个层面详细介绍R7S721031VCFP#AA1芯片。 一、R7S721031VCFP#AA1芯片简介 R7S721031VCFP#AA1芯片是一款功能强大的高…

数据结构与算法(C语言版)P6---队列

1、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除操作的特殊线性表&#xff0c;队列具有__先进先出__FIFO&#xff08;First In First Out&#xff09; 入队列&#xff1a;进行插入操作的一端称为__队尾__。 出队列&#xff1a;…

计算机网络 第四章:网络层

一.网络层概述 1.1分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机&#xff0c;可以将该任务划分为分组转发和路由选择两种重要的功能。 如图所示&#xff1a;这些异构型网络如果只是需要各自内部通信&#xff0c;那它们只需要实…

【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】三、 线性表里的链表&#xff08;无头单向非循环链表&#xff09;_高高的胖子的博客-CSDN博客 引言 通过上期对单链表&#xff08;无头单向非循环链表&#xff0…

python+vue理发店管理系统

理发店管理系统主要实现角色有管理员和会员,管理员在后台管理用户表模块、token表模块、收藏表模块、商品分类模块、热卖商品模块、活动公告模块、留言反馈模块、理发师模块、会员卡模块、会员充值模块、会员模块、服务预约模块、服务项目模块、服务类别模块、热卖商品评论表模…

【IC设计】NoC(Network on Chip)调研

文章目录 SoC&#xff08;System on Chip&#xff09;片上系统SoC的概念SoC总线架构存在的问题 互联网络基础①什么是互联网络&#xff1f;②哪里有互联网络&#xff1f;③互联网络的意义&#xff1f;④互联网络的参数有哪些 NoC&#xff08;Network on Chip&#xff09;片上互…

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…

近距离看GPU计算-2

文章目录 前言1.SIMT和硬件多线程3.GPU的Memory Hierarchy 前言 本文转自公众号 GPU and Computing 在《近距离看GPU计算》系列第一篇里我们介绍了GPU的一些基础知识及其如何从图形加速设备演化到通用计算平台。本文我们会具体从处理单元设计和存储层次结构两个方面探讨GPU不…