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

【spring Cloud Netflix】OpenFeign组件

1.概述

Feign旨在使编写Java Http客户端变得更容易。前面在使用Ribbon+RestTemplate进行服务的远程调用 时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由 于对服务的依赖调用可不止一处,往往一个服务接口可能会被多次调用,所以通常会针对每一个微服务自 行封装一些客户端来包装这些依赖服务的调用。所以feign在此基础上做了进一步的封装,由它来帮助我们 定义和实现依赖服务接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置 它,即可完成对服务提供方的接口绑定,简化了是RestTemplate进行服务调用的方式。

此外OpenFeign也集成了Ribbon组件,默认的情况下也可以按照轮询的机制来对服务提供方进行服务的远 程调用。而我们今天讲的OpenFeign其实是对Feign组件进行了增强。相对于Feign来说,OpenFeign支持 在接口上使用SpringMVC的注解。

OpenFeign的前身是NetFlix公司的Feign。SpringCloud在Feign的基 础上扩展了SpringMVC的注解。OpenFeign的FeignClient注解可 以解析SpringMVC的RequestMapping注解下面的接口,并通过动 态代理的方式产生实现类,实现类中做负载均衡,并调用其他服务。

2.OpenFeign的使用

2.1新建一个OpenFeign客户端

首先引入相关依赖

<dependencies>
<!-- Open Feign--> 
<dependency><groupId>org.springframework.cloud </groupId><artifactId>spring-cloud-starter-openfeign </artifactId><dependency><dependency><groupId>com.xq.common </groupId><artifactId>springcloud-netflix-service-common </artifactId><version>1.0-SNAPSHOT </version><dependency><dependencies>

然后定义相关的feign接口

在Feign里面定义接口,接口所在的包必须是和消费方启动类所在的目录同名,或者在其子目录下面。接 口的方法定义规则就是将服务提供方里面的方法拷贝过来,并去掉方法体,一定要带上SpringMVC的注解。

 @FeignClient(value = "service-provider") //标识当前接口是一个Feign客户端 name/value:服务提供方的名称
publicinterfacePaymentClient {//如果feign客户端@RequestMapping("provider/findById")publicResult<Payment> findById(@RequestParam("id") Longid);}

2.2服务消费方改造

首先在消费方启动类上添加Feign扫描的注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启对OpenFeign客户端的扫描(扫描的规则是当前启动类所在的包及其子包下面)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class,args);}
}

然后改造控制器方法

在服务消费方的控制器方法中注入Feign客户端,实现服务的远程调用。

// 表明这是一个 RESTful 风格的控制器,会将方法的返回值直接作为 HTTP 响应体返回
@RestController
// 为该控制器下的所有请求映射添加统一的前缀 "/consumer"
@RequestMapping("consumer")
// 使用 Lombok 提供的注解,为类自动生成 SLF4J 的日志记录器
@Slf4j
// 抑制代码中所有的警告信息
@SuppressWarnings("all")
public class PaymentController {// 自动注入 PaymentClient 实例,PaymentClient 是使用 OpenFeign 定义的客户端接口,用于调用远程服务@AutowiredPaymentClient paymentClient;/*** 根据支付记录的 ID 查询支付信息** @param id 支付记录的 ID,通过路径变量从 URL 中获取* @return 返回一个包含 Payment 对象的 Result 结果对象*/@RequestMapping("findById/{id}")public Result<Payment> findById(@PathVariable("id") Long id) {// 调用 PaymentClient 接口中的 findById 方法,根据 ID 查询支付信息// 该方法会通过 OpenFeign 自动调用远程服务并返回结果Result<Payment> result = paymentClient.findById(id);// 将查询结果返回给客户端return result;}
}

2.3Feign的超时控制

现在我们改造提供方的代码,如果我们通过Thread.sleep()方法对服务提供方控制器代码进行改造:

 @RequestMapping("findById")publicResult<Payment> findById(@RequestParam("id") Longid){try {Thread.sleep(3000);Paymentpayment = paymentService.findById(id);returnnewResult(200,"数据查询成功,端口号是:" + port,payment);} catch (Exceptione) {e.printStackTrace();returnnewResult(500,"查询失败",null);}}

此时就会报错,会出现超时,因为在默认的情况下,使用Feign进行服务提供方的远程调用,默认的超时时间是1秒钟,,如果1s钟还没有响应,那么就会抛出服务调用超时异常。所以我们需要在服务消费方的配 置文件里面修改Feign的超时时间。

 # 使用ribbon进行超时控制
ribbon:ReadTimeout: 5000 #指的是建立连接所需要的的时间
ConnectTimeout: 5000 #指的是建立连接之后,服务器读取资源需要的时间

2.4OpenFeign日志打印

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http的请求细节。说白了 就是对Feign接口的调用情况进行监控和输出。

日志的级别有以下:

NONE: 默认的,不显示任何日志。
BASIC:仅记录请求方法、URL、响应状态码及执行时间。
HEADERS:除了BASIC定义的信息之外,还有请求和响应的头信息。
FULL:除了HEADERS定义的信息之外,还有请求和响应的正文及元数据信息。

接下来写一个示例来演示

首先,编写配置类

 @Configurationpublic class FeignConfig {@BeanLogger.Level feignLoggerLevel(){return Logger.Level.FULL;}}

编写yml配置文件

#日志配置
logging:level:com.xq.client.PaymentClient: debug

相关文章:

【spring Cloud Netflix】OpenFeign组件

1.概述 Feign旨在使编写Java Http客户端变得更容易。前面在使用RibbonRestTemplate进行服务的远程调用 时&#xff0c;利用RestTemplate对Http请求的封装处理&#xff0c;形成了一套模板化的调用方法。但是在实际开发中&#xff0c;由 于对服务的依赖调用可不止一处&#xff0…...

基于Flask的Windows命令大全Web应用技术解析与架构设计

基于Flask的Windows命令大全Web应用技术解析与架构设计 引言 Windows命令行工具是系统管理和开发调试的核心技能之一。然而&#xff0c;许多用户对常用命令的用法和场景并不熟悉。本文通过一个基于Flask框架开发的Web应用&#xff0c;系统性地整理了50个Windows命令的用法&…...

Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事

在 Qt Creator 中&#xff0c;**构建设置&#xff08;Build Settings&#xff09;下的构建步骤&#xff08;Build Steps&#xff09;**是控制项目如何编译、链接和生成最终产物的核心配置区域。它允许你自定义编译过程中的各个阶段&#xff08;如 qmake、make、cmake 等命令的具…...

(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统&#xff0c;发现这个组合真的非常强大&#xff0c;而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会&#xff0c;希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建&#xff1a;从零…...

Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)

最近佳作推荐&#xff1a; Java大厂面试题 – 深度揭秘 JVM 优化&#xff1a;六道面试题与行业巨头实战解析&#xff08;1&#xff09;&#xff08;New&#xff09; 开源架构与人工智能的融合&#xff1a;开启技术新纪元&#xff08;New&#xff09; 开源架构的自动化测试策略优…...

C++ 标准库参考手册深度解析

C 标准库参考手册是每个 C 开发者的必备工具。本文将系统性解析其架构设计、核心功能及实战应用技巧&#xff0c;帮助开发者构建高效的知识检索与代码开发工作流&#xff0c;涵盖从语法查询到编译器适配的全流程技术细节。 一、网站架构与技术细节 1. 信息组织体系 1.1 层级化…...

单片机学习笔记8.定时器

IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址&#xff0c;只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制&#xff0c;D4-D7为T1控制 GAT…...

神经网络入门:生动解读机器学习的“神经元”

神经网络作为机器学习中的核心算法之一&#xff0c;其灵感来源于生物神经系统。在本文中&#xff0c;我们将带领大家手把手学习神经网络的基本原理、结构和训练过程&#xff0c;并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者&#xf…...

2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化

文章目录 1 过拟合1.1 过拟合问题1.2 解决过拟合 2 正则化2.1 正则化代价函数2.2 线性回归的正则化2.3 逻辑回归的正则化 1 过拟合 1.1 过拟合问题 欠拟合&#xff08;Underfitting&#xff09; 模型过于简单&#xff0c;无法捕捉数据中的模式&#xff0c;导致训练误差和测试误…...

美团滑块 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 距离识别不准简单学习一下&…...

C++ atomic 原子操作

一、原子操作简介 在多线程编程中&#xff0c;通常我们需要多个线程共享数据。但如果不加以控制&#xff0c;多个线程同时访问同一数据&#xff0c;可能会导致数据不一致或竞争条件&#xff08;race conditions&#xff09;。为了解决这个问题&#xff0c;我们引入了 原子操作…...

Leetcode - 双周赛153

目录 一、3498. 字符串的反转度二、3499. 操作后最大活跃区段数 I三、3500. 将数组分割为子数组的最小代价四、3501. 操作后最大活跃区段数 II 一、3498. 字符串的反转度 题目连接 本题直接模拟&#xff0c;代码如下&#xff1a; class Solution {public int reverseDegree(…...

25.4 GLM-4+RAG智能标注实战:标注成本暴降60%,检索准确率飙升40%!

使用 GLM-4 优化 RAG 程序:智能标注提升检索质量 关键词:GLM-4 数据标注, RAG 优化, 检索增强生成, 向量数据库, 语义关联度分析 1. RAG 数据标注的核心挑战 在检索增强生成(Retrieval-Augmented Generation)系统中,检索数据的标注质量直接影响最终生成效果。传统标注方…...

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…...

Cortex-M3 NVIC可以控制异常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中断控制器)不直接控制整个异常向量表,但可以管理向量表中与中断相关的部分行为。以下是 NVIC 对异常向量表的具体控制范围和相关机制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中断(IRQ) 和部分 系统异常 的行为,但对向量表本身的存储位…...

AI朝代应避免AI幻觉:分析与应对策略

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI的应用领域已经涵盖了文本生成、图像与视频创作以及程序编写等多个方面。然而&#xff0c;AI的生成能力并非没有缺陷&#xff0c;其中最为显著的之一就是所谓的“AI幻觉”&#xff08;AI hallucination&…...

网络传输H.264方法对比

一、引言 网络传输H.264有多种方法&#xff0c;包括但不限于&#xff1a;1.通过RTP直接传输H.264&#xff1b;2.通过UDP传输TS流&#xff1b;3.通过RTP传输TS流&#xff1b;4.通过RTP传输PS流。本文对这些方法进行对比。 二、通过RTP直接传输H.264 这种方案就是RTP包&#xf…...

第九章:可靠通信_《凤凰架构:构建可靠的大型分布式系统》

第九章 可靠通信 一、零信任网络模型 核心难点&#xff1a;理解安全模型从传统边界防护到动态信任验证的转变 零信任的核心原则 不再区分"内部可信网络"与"外部不可信网络"&#xff08;传统防火墙模型失效&#xff09;每次请求都需要进行身份验证和授权…...

HeidiSQL:多数据库管理工具

HeidiSQL 是一款广受欢迎的免费开源数据库管理工具&#xff0c;专为数据库管理员及开发者设计。无论您是刚接触数据库领域的新手&#xff0c;还是需要同时处理多种数据库系统的专业开发者&#xff0c;该工具都能凭借其直观的界面和强大的功能&#xff0c;助您轻松完成数据管理任…...

文件系统-inode/软硬件连接(未完结)

首先我们了解一下文件简洁理解来说就是&#xff1a;文件内容文件属性 ---> 磁盘上存储的文件存文件的内容存文件的属性&#xff1b;而文件的内容----存放在每个数据块 &#xff1b;文件属性存放在iNode里面。 要明白&#xff1a;linux系统中的文件是存储在磁盘中的&#xf…...

数据库并发控制问题

并发控制问题是数据库管理系统&#xff08;DBMS&#xff09;中处理多个事务并发执行时&#xff0c;确保数据一致性、可靠性和完整性的一系列技术和挑战。并发控制问题通常与事务的隔离性和事务之间的相互影响有关。以下是并发控制中主要的几种问题及其解决方式的详细解释&#…...

(五)智能体与工具协同——打造智能对话的超级助手

上一篇&#xff1a;&#xff08;四&#xff09;数据检索与增强生成——让对话系统更智能、更高效 在前四个阶段&#xff0c;我们已经搭建了一个功能强大的智能对话&#xff0c;并深入探讨了输入输出处理、链式工作流构建和数据检索与增强生成的细节。现在&#xff0c;我们将进…...

第十三届蓝桥杯 2022 省 B 刷题统计

题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目,周六和周日每天做 b b b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一行包含三个整数 a , b a, b a,b 和 n n n. 输出格…...

NLP/大模型八股专栏结构解析

1.transformer 结构相关 &#xff08;1&#xff09;transformer的基本结构有哪些&#xff0c;分别的作用是什么&#xff0c;代码实现。 NLP高频面试题&#xff08;一&#xff09;——Transformer的基本结构、作用和代码实现 &#xff08;2&#xff09;LSTM、GRU和Transformer结…...

不在 qtdesigner中提升,进行主题程序设计

以下是无需在Qt Designer中提升控件的完整主题化方案&#xff0c;保持现有代码结构的同时实现动态阴影效果管理&#xff1a; 一、增强主题管理器&#xff08;支持动态控件发现&#xff09; // thememanager.h #pragma once #include <QObject> #include <QSet> #…...

TDengine 3.3.6.0 版本中非常实用的 Cols 函数

简介 在刚刚发布的 TDengine 3.3.6.0 版本 中&#xff0c;新增了一个非常实用的 函数COLS &#xff0c;此函数用于获取选择函数所在行列信息&#xff0c;主要应用在生成报表数据&#xff0c;每行需要出现多个选择函数结果&#xff0c;如统计每天最大及最小电压&#xff0c;并报…...

MessageQueue --- RabbitMQ WorkQueue and Prefetch

MessageQueue --- RabbitMQ WorkQueue and Prefetch 什么是WorkQueue分发机制 --- RoundRobin分发机制 --- PrefetchSpring example use prefetch --- Fair Dispatch 什么是WorkQueue Work queues&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同…...

第四章:透明多级分流系统_《凤凰架构:构建可靠的大型分布式系统》

第四章&#xff1a;透明多级分流系统 一、客户端缓存 核心目标&#xff1a;减少重复请求&#xff0c;降低服务端压力。 1. 强制缓存 定义&#xff1a;客户端直接根据缓存规则决定是否使用本地缓存&#xff0c;无需与服务端交互。关键HTTP头&#xff1a; Cache-Control&#…...

题解:AT_abc241_f [ABC241F] Skate

一道经典的 bfs 题。 提醒&#xff1a;本题解是为小白专做的&#xff0c;不想看的大佬请离开。 这道题首先一看就知道是 bfs&#xff0c;但是数据点不让我们过&#xff1a; 1 ≤ H , W ≤ 1 0 9 1\le H,W\le10^9 1≤H,W≤109。 那么我们就需要优化了&#xff0c;从哪儿下手…...

热题100-字母异位词分组

方法用Arrays.sort对每个String 进行排序&#xff0c;毕竟排序以后都一样了&#xff0c;然后放入Map中的key跟value&#xff0c;可以一对多&#xff0c;然后返回的时候只要返回Map中所有的values就可以了 class Solution {public List<List<String>> groupAnagram…...

WiFi加密协议

目录 1. 认证(Authentication)‌ ‌1.1 开放系统认证(Open System Authentication)‌ 1.2 共享密钥认证(Shared Key Authentication)‌ ‌1.3 802.1X/EAP认证(企业级认证)‌ ‌2. 关联(Association)‌ ‌3. 加密协议(Security Handshake)‌ ‌整体流程总结‌…...

【AI提示词】书籍推荐专家

提示说明 帮助您找到适合您的好书。 提示词 ## Role: 书籍推荐专家## Profile: - author: xxx - version: 1.0.0 - language: 中文 - description: 我是一位书籍推荐专家&#xff0c;我可以帮助您找到适合您的好书。## Goals: - 吸引读者的注意力&#xff0c;引导他们阅读更…...

Linux进程间通信——有名管道

一.概念 函数形式&#xff1a;int mkfifo(const char \*filename,mode_t mode); 功能&#xff1a;创建管道文件 参数&#xff1a;管道文件文件名\路径&#xff0c;权限&#xff0c;创建的文件权限仍然和umask有关系。 返回值&#xff1a;创建成功返回0&#xff0c;创建失败返回…...

JavaScript基础--01-JS简介

字面量&#xff1a;数字、字符串、布尔值 前言JavaScript背景Web前端有三层&#xff1a;发展历史JavaScript的发展&#xff1a;蒸蒸日上 JavaScript介绍JavaScript入门易学性JavaScript是脚本语言JavaScript的组成 JavaScript 的特点特点1&#xff1a;解释型语言特点2&#xff…...

2025年 能够有效提升AI的生成质量和逻辑严谨性 的通用型系统提示

以下是三个经过精心设计的通用型系统提示&#xff08;System Prompt&#xff09;&#xff0c;能够有效提升AI的生成质量和逻辑严谨性&#xff0c;适用于各类对话、分析和创作场景&#xff1a; Prompt 1 - 专家级分步验证模式 你是一个具备跨领域知识整合能力的超级AI&#xff…...

xss攻击

XSS 攻击&#xff0c;即跨站脚本攻击&#xff08;Cross - Site Scripting&#xff09;&#xff0c;是一种常见的 Web 应用程序安全漏洞。以下是关于它的详细介绍&#xff1a; 原理 输入输出控制不严&#xff1a;程序对用户输入和输出处理不当。用户输入的数据没有经过充分的过…...

Node.js核心模块及Api详解

以下是 Node.js 最常用的核心模块及 API 详解&#xff0c;按使用频率和重要性分类整理&#xff1a; 一、高频核心模块 1. fs 文件系统 const fs require(fs); const fsPromises require(fs).promises; // Promise 版本// 异步读取文件&#xff08;推荐&#xff09; fs.read…...

解析keras.layers.Layer中的权重参数

文章目录 概要__init__()build()add_weight() 概要 keras.layers.Layers是所有层对象的父类,在keras.layers下所有实现类都是其子类&#xff0c;自定义层时需要继承该类。 init() Layer的构造函数&#xff0c;需要注意两个参数trainable和name trainable&#xff1a;指定该层…...

原型设计工具即时设计的简单使用攻略

即时设计是一款国产在线协同设计工具&#xff0c;支持从原型设计到开发交付的全流程&#xff0c;尤其擅长Web/App界面原型制作。其核心优势体现在&#xff1a; • 零门槛入门&#xff1a;浏览器直接访问无需安装&#xff0c;中文界面友好 • 资源生态完善&#xff1a;内置3000原…...

深入解析C++智能指针:从内存管理到现代编程实践

一、智能指针核心概念 1.1 智能指针的本质 智能指针是基于**RAII&#xff08;资源获取即初始化&#xff09;**的封装类&#xff0c;通过对象生命周期自动管理动态内存。与传统指针相比&#xff1a; 特性原始指针智能指针内存管理手动自动空指针检查需显式判断支持空状态检测…...

在 Langflow 中构建灵活的自定义组件:从基础到高级实践

本文深入探讨了如何在 Langflow 平台中创建功能丰富的自定义组件。通过详细的目录结构解析、分步实现指南和多个实战案例&#xff0c;帮助开发者掌握利用 Python 生态扩展低代码平台的方法&#xff0c;打造高效的数据处理流程。 理解组件架构设计 自定义组件是在 Langflow 中创…...

【数学建模】(时间序列模型)ARIMA时间序列模型

ARIMA时间序列模型详解及常见时间序列模型概览 文章目录 ARIMA时间序列模型详解及常见时间序列模型概览1 引言2 ARIMA模型的基本概念3 ARIMA模型的组成部分详解3.1 AR模型 (自回归模型)3.2 MA模型 (移动平均模型)3 I (差分) 4 ARIMA模型的建模步骤5 Python实现ARIMA模型6 常见时…...

模版的特性及其编译分离

1.模版的分类 模版参数分为 类型形参 和 非类型形参 类型形参&#xff1a;出现在模版参数列表中&#xff0c;跟在class和typename之后的参数类型名称 非类型形参&#xff1a;就是用一个常量作为类&#xff08;函数&#xff09;模版的一个参数&#xff0c;在类&#xff08;函…...

8电池_多绕组反激式变压器均衡_4模式

(1)8节串联锂离子电池组 (2)多绕组双向反激式变压器&#xff0c;1个变压器解决多电池均衡 (3)亮点&#xff1a;支持1建切换4种均衡算法–>全网唯一 (4)多绕组变压器均衡也能设计多种均衡算法–>全网唯一 锂离子电池均衡&#xff0c;均衡拓扑&#xff0c;均衡算法...

6.1 python加载win32或者C#的dll的方法

python很方便的可以加载win32的方法以及C#编写的dll中的方法或者变量&#xff0c;大致过程如下。 一.python加载win32的方法&#xff0c;使用win32api 1.安装库win32api pip install win32api 2.加载所需的win32函数并且调用 import win32api win32api.MessageBox(0,"…...

STP学习

{所有内容均来自于西安欧鹏的陈俊老师} STP生成树 当二层交换机意外成环路的时候会发生&#xff1a; 1.广播风暴&#xff1a;当广播帧进入环路时&#xff0c;会被不断复制并传输&#xff0c;导致网络中的广播流量急剧增加&#xff0c;消耗大量的网络带宽&#xff0c;降低网络…...

特征值与特征向量:从理论到应用的全面解析

特征值与特征向量&#xff1a;从理论到应用的全面解析 一、特征值与特征向量核心概念 定义 对于方阵 ( A )&#xff0c;若存在标量 ( \lambda ) 和非零向量 ( v )&#xff0c;使得&#xff1a; [ A v \lambda v ] 则 ( \lambda ) 为特征值&#xff0c;( v ) 为对应的特征向…...

【Python】数组的条件逻辑统计运算元素排序

【Python】数组的条件逻辑&统计运算&元素排序&#xff1a; 一.条件逻辑二.统计运算三.数组元素排序检索数组元素是否满足条件查找数组的唯一元素判断元素是否在其他数组中 一.条件逻辑 import numpy as np arr_x np.array([1, 5, 7]) arr_y np.array([2, 6, 8]) arr_…...

数据流和重定向

1、数据流 不管正确或错误的数据都是默认输出到屏幕上&#xff0c;所以屏幕是混乱的。所以就需要用数据流重定向将这两 条数据分开。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去 标准输入&#xff08;standard input&#xff0c;简称stdin&#xff…...

Jetpack Compose 自定义组件完全指南

Jetpack Compose 自定义组件完全指南 Compose 的声明式 UI 范式为创建自定义组件提供了前所未有的灵活性。本指南将带你从基础到高级全面掌握 Compose 自定义组件的开发技巧。 一、自定义组件基础 1.1 基本结构 一个最简单的自定义组件&#xff1a; Composable fun Greeti…...