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

springBoot项目使用Elasticsearch教程

目录

  • 一、引言
    • (一)使用背景
    • (二)版本库区别
  • 二、引入依赖
    • (一)springboot集成的es依赖(建议)
    • (二)es提供的客户端库
  • 三、配置(以yaml文件为例)
    • (一)springboot集成的es依赖(建议)
    • (二)es提供的客户端库
  • 四、代码
    • (一)springboot集成的es依赖(建议)
      • 1、创建Elasticsearch实体类
      • 2、创建Elasticsearch Repository
      • 3、使用Elasticsearch Repository
      • 4、es业务类-使用Elasticsearch模板(可选)
      • 5、启动测试类
    • (二)es提供的客户端库
      • 1、es连接配置类-ElasticSearchConfig
      • 2、es业务类-ElasticSearchService
      • 3、启动测试类
  • 五、总结

一、引言

(一)使用背景

Spring项目集成Elasticsearch可以带来许多好处,主要包括:

  • 高性能搜索:Elasticsearch是基于Lucene的分布式搜索引擎,它能提供非常高效和低延迟的全文搜索、结构化查询以及分析。对于需要快速响应的查询操作,Elasticsearch能够提供显著的性能提升。
  • 灵活的数据模型:Elasticsearch是一个文档数据库,使用JSON格式存储数据,使得数据模型非常灵活,能够处理各种结构化和半结构化数据。可以轻松应对变化的数据模型和复杂的查询需求。
  • 分布式架构:Elasticsearch的分布式架构使得它具备了强大的水平扩展能力。即使数据量增长,集群也能够通过增加节点来轻松扩展,保证性能和可用性。
  • 实时性:Elasticsearch支持近实时搜索,数据一旦写入便能立即查询。这对于报表服务、实时数据分析和监控等应用场景非常适用。
  • Spring Data Elasticsearch支持:Spring提供了Spring Data
    Elasticsearch,一个高层次的框架,用来简化Spring与Elasticsearch的集成。它封装了Elasticsearch的低层API,提供了易于使用的Repository和Template,减少了开发中的重复工作。
  • 强大的聚合功能:Elasticsearch的聚合功能非常强大,可以对大量数据进行分组、统计、计算,帮助构建各种报表和分析应用。
  • 易于集成和配置:Spring
    Boot的自动配置功能使得Elasticsearch的集成变得非常简单。你只需要在application.properties或application.yml中配置连接信息,就能快速启用Elasticsearch的功能。
  • 监控和管理工具:Elasticsearch提供了如Kibana等强大的监控和可视化工具,可以帮助开发者轻松监控和调试系统运行状态。
  • 可扩展性和适应性:随着业务需求和数据量的增长,Elasticsearch能够通过集群扩展来应对。你可以随时根据需要增加更多节点、分片等。
  • 简化的查询和索引操作:Spring Data
    Elasticsearch提供了简单易用的API来执行索引操作、查询操作、批量操作等,开发者不需要深入掌握Elasticsearch的底层操作,能专注于业务逻辑的实现。

(二)版本库区别

1.spring-boot-starter-data-elasticsearch
功能:这是Spring Boot为集成Spring Data Elasticsearch提供的启动器。它通过Spring Data提供了简化的数据访问接口,使得开发者可以更轻松地与Elasticsearch交互。
用途:适用于Spring Boot应用,尤其是当你需要一个简化的方式来存取数据,而不想处理Elasticsearch客户端的复杂配置时。它提供了ElasticsearchRepository,自动化配置,方便进行基本的CRUD操作和查询。
优点:
自动配置:Spring Boot会自动配置好Elasticsearch连接和必要的基础设置,减少了手动配置的繁琐。
面向开发者的Repository接口:通过ElasticsearchRepository接口,开发者可以像操作普通数据库一样执行Elasticsearch的基本操作(如保存、查找、删除等)。
集成其他Spring功能:能够与Spring的事务管理、数据绑定等功能紧密集成。
简化操作:隐藏了底层的客户端实现细节,适合标准的应用开发。
2. elasticsearch-rest-high-level-client 和 elasticsearch-rest-client
功能:这两个是纯粹的Elasticsearch客户端库,分别提供了较高层次(rest-high-level-client)和较低层次(rest-client)的访问接口。它们专注于与Elasticsearch服务器之间的网络通信和数据传输,不提供Spring特有的集成。
用途:这两个依赖适合需要更精细控制或更复杂的Elasticsearch操作的场景。例如,你可以在这些客户端中直接操作Elasticsearch的REST API,进行高级的索引操作、聚合查询等,甚至实现一些自定义的网络请求和数据序列化。
优点:
高灵活性:提供了更细粒度的控制,你可以直接处理请求和响应。
支持更多功能:如果你需要对Elasticsearch进行更复杂的操作,可能会发现elasticsearch-rest-high-level-client或elasticsearch-rest-client能提供更多的灵活性和控制。

  • 如果你是在SpringBoot应用中开发,且不需要过多的手动配置和细节控制,推荐使用spring-boot-starter-data-elasticsearch。
  • 使用es可以用springboot集成的es库,也可以用es提供的客户端库,本文围绕两种方式展开

二、引入依赖

两种方式均可

(一)springboot集成的es依赖(建议)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>${spring.boot.version}</version>
</dependency>

(二)es提供的客户端库

version具体以es的服务端版本为参考,需要匹配

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.2</version>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.10.2</version>
</dependency>

三、配置(以yaml文件为例)

(一)springboot集成的es依赖(建议)

spring:data:elasticsearch:cluster-name: your-cluster-namecluster-nodes: localhost:9200  # ES节点的地址和端口username: 用户名password: 密码

(二)es提供的客户端库

elasticsearch:host: 服务端主机ipport: 9200scheme: httpusername: 用户名password: 密码

四、代码

(一)springboot集成的es依赖(建议)

1、创建Elasticsearch实体类

你需要创建一个实体类,使用@Document注解标记它为Elasticsearch文档类型,定义索引名称、类型等信息。

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName = "pos_order", createIndex = false)
public class PosOrder {@Idprivate String id;private String customerName;private double totalAmount;// Getter and Setter methods
}

2、创建Elasticsearch Repository

Spring Data Elasticsearch提供了ElasticsearchRepository接口,用于与Elasticsearch进行交互:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface PosOrderRepository extends ElasticsearchRepository<PosOrder, String> {// 你可以根据需求定义其他查询方法List<PosOrder> findByCustomerName(String customerName);
}

3、使用Elasticsearch Repository

在你的Service或Controller中注入PosOrderRepository并使用它来进行CRUD操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class PosOrderService {@Autowiredprivate PosOrderRepository posOrderRepository;public void saveOrder(PosOrder posOrder) {posOrderRepository.save(posOrder);}public List<PosOrder> findOrdersByCustomerName(String customerName) {return posOrderRepository.findByCustomerName(customerName);}
}

4、es业务类-使用Elasticsearch模板(可选)

如果需要执行更复杂的查询,可以使用ElasticsearchRestTemplate:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Service;@Service
public class PosOrderService {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;public void searchOrders() {// 自定义查询逻辑}
}
  • 通过这些步骤,你可以在Spring Boot项目中轻松地集成Elasticsearch,实现数据的存储、查询等功能。

5、启动测试类

如果你是使用Spring Boot进行开发,确保你的服务已经注入并正常工作。你可以在Spring Boot的启动类或一个控制器中调用测试方法。
例如,在Spring Boot启动类中调用测试方法:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Autowired;@SpringBootApplication
public class ElasticsearchTestApplication implements CommandLineRunner {@Autowiredprivate PosOrderService posOrderService;public static void main(String[] args) {SpringApplication.run(ElasticsearchTestApplication.class, args);}@Overridepublic void run(String... args) throws Exception {// 调用测试方法posOrderService.searchOrders();  // 或其他方法,如testIndexDocument(), testSearch(), etc.}
}

(二)es提供的客户端库

1、es连接配置类-ElasticSearchConfig

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @className: ElasticsearchConfig* @description: es客户端连接配置类* @author: wuyafei* @date: 2025/1/16 15:57* @version: 1.0*/
@Configuration
public class ElasticSearchConfig {@Value("${elasticsearch.host}")private String esHost;@Value("${elasticsearch.port}")private int esPort;@Value("${elasticsearch.scheme}")private String esScheme;@Value("${elasticsearch.username}")private String esUsername;@Value("${elasticsearch.password}")private String esPassword;@Beanpublic RestHighLevelClient client() {// 配置基本身份验证的用户名和密码BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(esUsername, esPassword));// 创建一个 HttpAsyncClientBuilder,并设置身份验证HttpAsyncClientBuilder asyncClientBuilder = HttpAsyncClients.custom().setDefaultCredentialsProvider(credentialsProvider);// 返回 RestHighLevelClient,并通过 setHttpClientConfigCallback 传递 HttpAsyncClientBuilderreturn new RestHighLevelClient(RestClient.builder(new HttpHost(esHost, esPort, esScheme)).setHttpClientConfigCallback(httpClientConfig -> asyncClientBuilder));}}

注意事项:HTTP与HTTPS:如果Elasticsearch实例使用HTTPS协议,确保修改HttpHost为https,并调整端口(通常是443)

2、es业务类-ElasticSearchService

package com.hxl.bi.service.es;import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;/*** @className: ElasticsearchService* @description: es查询service* @author: wuyafei* @date: 2025/1/16 16:27* @version: 1.0*/
@Service
public class ElasticSearchService {private final RestHighLevelClient client;public ElasticSearchService(RestHighLevelClient client) {this.client = client;}public void searchDocument() throws Exception {//创建搜索请求(索引)SearchRequest searchRequest = new SearchRequest("bi-pos-order-query-2025");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1、全部查询sourceBuilder.query(QueryBuilders.matchAllQuery());
//		//2、精确查询
//		sourceBuilder.query(QueryBuilders.termQuery("orderNo", "6660001250070030004"));
//		//3、范围查询
//		sourceBuilder.query(QueryBuilders.rangeQuery("orderNo").gte(6660001250070030003l).lte(6660001250070030005l));
//		//4、模糊查询
//		sourceBuilder.query(QueryBuilders.fuzzyQuery("orderNo", "6660001250070030004").fuzziness(Fuzziness.ONE));
//		//5、多字段查询
//		sourceBuilder.query(QueryBuilders.multiMatchQuery("hello", "field1", "field2"));
//		//6、布尔查询-boolQuery 允许你组合多个查询,支持 must(必须匹配)、should(可以匹配)、must_not(不能匹配)等操作
//		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
//				.must(QueryBuilders.termQuery("order_id", "123"))
//				.should(QueryBuilders.rangeQuery("total_amount").gte(100))
//				.mustNot(QueryBuilders.termQuery("status", "canceled"));
//		sourceBuilder.query(boolQuery);
//		searchRequest.source(sourceBuilder);
//		//7、存在查询-existsQuery 用于查询某个字段是否存在。常用于检查某个字段是否被填充
//		sourceBuilder.query(QueryBuilders.existsQuery("customer_name"));
//		//8、前缀查询-prefixQuery 用于查询某个字段的前缀匹配。常用于搜索建议
//		sourceBuilder.query(QueryBuilders.prefixQuery("orderId", "ORD"));
//		//9、组合查询-constantScoreQuery 用于组合多个查询,并使用一个权重对它们进行评分。常用于提高查询结果的相关性
//		sourceBuilder.query(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("status", "active")));
//		//10、聚合查询-aggregation 聚合查询用于对查询结果进行分组和统计。常用于生成报表和统计信息
//		sourceBuilder.aggregation(
//				AggregationBuilders.terms("agg_by_status").field("status.keyword")
//		);
//		//11、排序查询
//		sourceBuilder.sort("total_amount", SortOrder.DESC);  // 根据 `total_amount` 降序排序SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 打印查询到的文档总数System.out.println("Total hits: " + response.getHits().getTotalHits().value);// 获取并打印每个文档的详细内容for (SearchHit hit : response.getHits()) {// 打印文档的IDSystem.out.println("Document ID: " + hit.getId());// 打印文档的源数据 (即文档的实际内容)System.out.println("Document Source: " + hit.getSourceAsString());// 如果需要进一步处理每个字段,可以通过 hit.getSourceAsMap() 获取字段及其对应的值System.out.println("Document Fields: " + hit.getSourceAsMap());}}}
  • 上面包含了es查询11个api,按照实际业务需要去适配

3、启动测试类

如果你是使用Spring Boot进行开发,确保你的服务已经注入并正常工作。你可以在Spring Boot的启动类或一个控制器中调用测试方法。
例如,在Spring Boot启动类中调用测试方法:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Autowired;@SpringBootApplication
public class ElasticsearchTestApplication implements CommandLineRunner {@Autowiredprivate ElasticSearchService elasticsearchService;public static void main(String[] args) {SpringApplication.run(ElasticsearchTestApplication.class, args);}@Overridepublic void run(String... args) throws Exception {// 调用测试方法elasticsearchService.searchDocument();  // 或其他方法,如testIndexDocument(), testSearch(), etc.}
}

五、总结

相关文章:

springBoot项目使用Elasticsearch教程

目录 一、引言&#xff08;一&#xff09;使用背景&#xff08;二&#xff09;版本库区别 二、引入依赖&#xff08;一&#xff09;springboot集成的es依赖&#xff08;建议&#xff09;&#xff08;二&#xff09;es提供的客户端库 三、配置&#xff08;以yaml文件为例&#x…...

模型 多元化思维(系统科学)

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。融合多学科知识&#xff0c;全面解决问题。 1 多元化思维模型的应用 1.1 完美日记的私域流量运营 完美日记作为美妆行业的新兴品牌&#xff0c;通过多元化的思维模型在私域流量运营中取得了显著成功。…...

Google地图瓦片爬虫

地图地址说明 1、谷歌矢量(中文标注) http://mt{0-3}.google.cn/vt/vm416115521&hlzh-CN&glcn&x{x}&y{y}&z{z}&sGalileo 2、谷歌矢量(英文标注) http://mt{0-3}.google.cn/vt/vm416115521&hlen&glcn&x{x}&y{y}&z{z}&sGali…...

【C++】size_t全面解析与深入拓展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、什么是size_t&#xff1f;为什么需要size_t&#xff1f; &#x1f4af;二、size_t的特性与用途1. size_t是无符号类型示例&#xff1a; 2. size_t的跨平台适应性示例对…...

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <...

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的&#xff0c;用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此&#xff0c;如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用&#xff0c;那…...

C语言变长嵌套数组常量初始化定义技巧

有时候&#xff0c;我们需要在代码里配置一些常量结构&#xff0c;比如一个固定的动作流程ActionFlow&#xff1a;包含N&#xff08;即flow_num&#xff09;个动作列表&#xff08;ActionArray&#xff09;&#xff0c;每个动作列表包含M&#xff08;即act_num&#xff09;个可…...

如何查看特定版本的Spring源码

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…...

【深度学习】关键技术-激活函数(Activation Functions)

激活函数&#xff08;Activation Functions&#xff09; 激活函数是神经网络的重要组成部分&#xff0c;它的作用是将神经元的输入信号映射到输出信号&#xff0c;同时引入非线性特性&#xff0c;使神经网络能够处理复杂问题。以下是常见激活函数的种类、公式、图形特点及其应…...

网关相关知识

文章目录 什么是网关网关的主要作用网关的运用 什么是网关 网关又称网间连接器、协议转换器&#xff0c;也就是网段(局域网、广域网)关卡&#xff0c;不同网段中的主机不能直接通信&#xff0c;需要通过关卡才能进行互访&#xff0c;比如IP地址为192.168.31.9(子网掩码&#x…...

SpringBoot整合SpringSecurity详解

文章目录 SpringBoot整合SpringSecurity详解一、引言二、引入依赖三、配置 Spring Security四、自定义用户详细信息服务五、使用示例1. 创建用户实体类2. 测试登录功能 六、总结 SpringBoot整合SpringSecurity详解 一、引言 在当今的软件开发中&#xff0c;安全是一个至关重要…...

【C++基础】enum,union,uint8_t,static

enum 所以有时候使用 Enum 的目的&#xff0c;不是为了自定义一种数据类型&#xff0c;而是为了声明一组常量。 from: https://github.com/wangdoc/clang-tutorial/blob/main/docs/enum.md union C 语言提供了 Union 结构&#xff0c;用来自定义可以灵活变更的数据结构。它内部…...

单片机的原理及其应用:从入门到进阶的全方位指南

以下是一篇详细、深入的“单片机的原理及其应用”博客文章示例&#xff0c;适合想要系统学习或深入了解单片机的读者。文中不仅会介绍单片机的基本原理、内部构造、开发流程和应用领域&#xff0c;还会融入更多的理论分析、实操案例以及常见问题与解决思路等&#xff0c;帮助读…...

如何使用 Go语言操作亚马逊 S3 对象云存储

以下是使用 Go 语言操作亚马逊 S3 对象云存储的详细步骤和示例代码&#xff1a; 解决思路&#xff1a; 安装必要的 Go 语言包&#xff0c;这里我们将使用 aws-sdk-go 包来与 Amazon S3 进行交互。配置 AWS 凭证&#xff0c;包括访问密钥和秘密访问密钥&#xff0c;以及 AWS 区…...

2025年应用与API安全展望:挑战与机遇并存

进入2025年&#xff0c;应用与API安全的重要性愈发突出。在过去的一年里&#xff0c;API技术已经成为数字创新的核心。然而&#xff0c;API的大规模应用也使得攻击面显著扩展&#xff0c;2024年针对业务逻辑漏洞的API攻击占比高达27%&#xff0c;较前一年增加10%。与此同时&…...

Linux安装docker,安装配置xrdp远程桌面

Linux安装docker&#xff0c;安装配置xrdp远程桌面。 1、卸载旧版本docker 卸载旧版本docker命令 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine现在就是没有旧版本的d…...

VD:生成a2l文件

目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了&#xff0c;这时的a2l文件还没有地址&#xff0c;所以紧接着会去通过elf文件更新地址&#xff0c;一直以为这是固定的流程和方法&#xff0c;今天无…...

【SpringBoot应用篇】SpringBoot+MDC+自定义Filter操作traceId实现日志链路追踪

【SpringBoot应用篇】SpringBootMDC自定义Filter操作traceId实现日志链路追踪 解决的问题解决方案MDC具体逻辑ymllogback-spring.xmlTraceIdUtil操作工具类TraceIdFilter自定义过滤器GlobalExceptionHandler全局异常处理类TraceIdAspect切面UserController测试验证 多线程处理M…...

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk&#xff0c;里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…...

【ArcGIS初学】产生随机点计算混淆矩阵

混淆矩阵&#xff1a;用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) &#xff1a;某类中正确分类的像元数除以参考数据中该类的像元数(列方向)&#xff0c;又称…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...