openfeign 只有接口如何创建bean的

OpenFeign 能够为纯接口创建 Spring Bean,其核心机制是通过动态代理Spring 的 FactoryBean 机制实现的。以下是详细的工作原理:


1. @EnableFeignClients 注解的启动

在 Spring Boot 主类上添加 @EnableFeignClients 注解:

@SpringBootApplication
@EnableFeignClients
public class Application { ... }

此注解会触发以下操作:

  • 扫描所有被 @FeignClient 标记的接口。

  • 为每个接口注册一个特殊的 FeignClientFactoryBean


2. FeignClientFactoryBean 的作用

FeignClientFactoryBean 实现了 Spring 的 FactoryBean 接口,核心方法是 getObject()

public class FeignClientFactoryBean implements FactoryBean<Object> {@Overridepublic Object getObject() {return getTarget(); // 创建动态代理}private <T> T getTarget() {// 1. 构建 Feign 客户端Feign.Builder builder = feign(context);// 2. 生成动态代理return (T) targeter.target(this, builder, context, new HardCodedTarget<>(type, name, url));}
}

3. 动态代理的创建过程

当 Spring 容器需要注入 Feign 客户端时,会调用 getObject() 方法:

(1) 构建 Feign 实例
  • 解析接口上的注解(如 @RequestMapping, @GetMapping)。

  • 配置编码器/解码器(如 JSON 转换)。

  • 集成负载均衡(如 Ribbon)或服务发现(如 Eureka)。

(2) 生成代理对象

通过 ReflectiveFeign 创建 JDK 动态代理:

public class ReflectiveFeign extends Feign {public <T> T newInstance(Target<T> target) {// 为每个方法创建 MethodHandlerMap<Method, MethodHandler> methodHandlers = ...;// 生成代理InvocationHandler handler = new FeignInvocationHandler(target, methodHandlers);return (T) Proxy.newProxyInstance(target.type().getClassLoader(),new Class<?>[] {target.type()},handler);}
}

4. 代理的执行逻辑

当调用接口方法时,动态代理拦截请求:

class FeignInvocationHandler implements InvocationHandler {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) {// 1. 解析方法注解和参数RequestTemplate template = buildTemplateFromArgs(method, args);// 2. 发送 HTTP 请求Response response = client.execute(template, options);// 3. 解码响应return decoder.decode(response, method.getReturnType());}
}

5. Spring Bean 的注册

  • Bean 类型:代理对象(实现原始接口的 JDK Proxy)。

  • Bean 名称:默认取接口全限定名,或通过 @FeignClient(name="serviceName") 指定。

  • 依赖注入:通过 @Autowired 注入时,实际注入的是动态代理对象:

  • @Autowired
    private UserServiceClient userService; // 实际为 Proxy 实例

    关键组件总结

    组件作用
    @EnableFeignClients启动 Feign 扫描和动态代理生成
    FeignClientFactoryBeanSpring 的 FactoryBean,负责创建代理
    ReflectiveFeign生成 JDK 动态代理
    FeignInvocationHandler代理逻辑:解析注解 → 构造请求 → 发送 HTTP 调用
    LoadBalancerFeignClient集成负载均衡(如 Ribbon)

    补充说明

  • 无实现类的原理
    动态代理在运行时生成接口的实现类($Proxy0),无需手动编写实现代码。

  • HTTP 请求的发送
    底层使用可插拔的 HTTP 客户端(默认 HttpURLConnection,可替换为 OkHttp 或 Apache HttpClient)。

  • 与 Spring 的整合
    通过 FeignContext 维护独立的配置上下文(如编解码器、拦截器)。

  • sequenceDiagramparticipant Springparticipant FeignFactoryparticipant DynamicProxyparticipant HTTP_ClientSpring->>FeignFactory: 需要注入 UserServiceClientFeignFactory->>DynamicProxy: 创建代理对象DynamicProxy-->>Spring: 返回 Proxy 实例Spring->>Service: 注入 ProxyService->>DynamicProxy: 调用 userService.getUser()DynamicProxy->>HTTP_Client: 构造 HTTP 请求HTTP_Client->>Remote: 发送 GET /userRemote-->>HTTP_Client: 返回 JSON 数据HTTP_Client->>DynamicProxy: 响应结果DynamicProxy->>Service: 返回 User 对象

    通过这种设计,OpenFeign 实现了声明式 HTTP 客户端:开发者只需定义接口,框架自动处理 HTTP 通信、负载均衡和序列化。

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

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

相关文章

【展厅多媒体】互动地砖屏怎么提升展厅互动感的?

在数字化展厅设计中&#xff0c;互动地砖屏 正成为提升观众参与度的重要工具。这种融合视觉科技与交互体验的装置&#xff0c;通过动态影像与即时反馈&#xff0c;让参观者从被动观看转变为主动探索&#xff0c;从而大幅增强展厅的互动感。 Led地面互动屏的优势在于其强大的视…

AI赋能电力巡检:变压器漏油智能检测系统全解析

&#x1f525; AI赋能电力巡检&#xff1a;变压器漏油智能检测系统全解析 &#x1f4d6; 前言 在电力系统的日常运维中&#xff0c;变压器作为核心设备&#xff0c;其安全运行直接关系到整个电网的稳定性。传统的人工巡检方式不仅效率低下&#xff0c;还存在安全隐患和漏检风险…

GitHub上值得Star的计算机视觉项目

GitHub上值得Star的计算机视觉项目 前言 一、OpenCV:计算机视觉领域的瑞士军刀 1.1 项目简介 1.2 核心功能与技术特点 1.3 代码示例 二、YOLO 系列:实时目标检测的领导者 2.1 项目简介 2.2 核心功能与技术特点 2.3 代码示例 三、Detectron2:Facebook AI Research 的目标检测…

【深度学习】pytorch深度学习框架的环境配置

文章目录1. 配置cuda环境2. 配置conda环境3. 配置pytorch gpu环境1. 配置cuda环境 在命令行输入以下命令可以查看当前显卡驱动版本和最高支持的cuda版本 nvidia-smi根据cuda版本去官网下载并安装cuda 下载链接&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive…

数据处理与统计分析 —— 房源数据集分析案例

数据集网盘下载&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/0e577858dba3?pwdFJnb 提取码&#xff1a;FJnb代码仅供参考具体可打开ipynb文件进行学习和练习&#xff1a;链接&#xff1a;https://pan.quark.cn/s/8efbe3061fad?pwdT47B 提取码&#xff1a;T47Bimport…

蓝牙如何测试?

车载蓝牙测试需覆盖 连接稳定性、功能完整性、兼容性、交互体验等核心维度,结合车载场景的特殊性(如行驶中信号干扰、多设备交互、安全需求),具体测试点如下: 一、基础配对与连接测试 1. 首次配对 触发配对:车机端 “蓝牙设置” 中搜索设备、手机端搜索车机(车机名称是…

算法02 二进制与位运算

二进制作为计算机底层数据的核心表示方式&#xff0c;其独特的位结构和运算规则在算法设计中有着广泛且关键的应用。以下从基础操作、算法技巧、数据结构、经典问题等多个维度&#xff0c;全面梳理二进制在算法中的应用&#xff1a; 一、基础位运算&#xff1a;算法的“原子操作…

PAT 1071 Speech Patterns

题目大意是说给出一个文本&#xff0c;找出里面出现最多的单词&#xff0c;如果有多个单词出现次数一样多&#xff0c;则输出字典序最小的。 需要注意的是&#xff1a; 给出的文本字符串不仅有数字还有字母&#xff0c;还有一些特殊的字符&#xff0c;还有空格。 而单词是只包含…

CSS中的 :root 伪类

在CSS中&#xff0c;伪类是一种用于选择元素特定状态的选择器。:root 伪类专门用于选择文档的根元素&#xff08;在HTML中通常是<html>元素&#xff09;&#xff0c;它是CSS变量&#xff08;Custom Properties&#xff09;的理想载体&#xff0c;常用于定义全局样式变量&…

能源行业数字化转型:边缘计算网关在油田场景的深度应用

能源行业数字化转型&#xff1a;边缘计算网关在油田场景的深度应用能源行业是国民经济的支柱产业&#xff0c;而油田作为能源生产的重要基地&#xff0c;其数字化转型对于提高生产效率、降低能耗、减少碳排放具有重要意义。然而&#xff0c;油田往往地处偏远&#xff0c;油井分…

CAG缓存增强生成与RAG检索增强生成对比

深度定制 LLM 知识,除了 RAC &#xff0c;现在又有新技术假设有一份200页的产品手册,你想让 LLM 准确回答里面的相关问题,要实现这个目标,除了常用的检索增强生成技术 rep ,现在有了新思路,缓存增强生成 CAG &#xff0c;它是什么,何时使用.RAG检索增强是常规套路,CAG缓存增强是…

基于vue、node.js、express的网络教学系统设计与实现/基于vue、node.js、express的在线学习系统设计与实现

基于vue、node.js、express的网络教学系统设计与实现/基于vue、node.js、express的在线学习系统设计与实现

享元模式引发的关于ECS和对象池的思考记录

文章目录概念概述解决了什么区别与联系享元模式的某个例子的细节分析概念概述 ECS&#xff08;Entity-Component-System&#xff09; 1、Entity&#xff08;实体&#xff09;&#xff1a;唯一标识符。 2、Component&#xff08;组件&#xff09;&#xff1a;纯数据容器&#x…

STM32驱动SG90舵机全解析:从PWM原理到多舵机协同控制

一、SG90舵机核心特性 1.1 基本参数与选型 SG90作为​​微型舵机的代表​​,凭借其​​轻量化设计​​(仅9g)和​​高性价比​​,在机器人、智能小车和云台系统中广泛应用: ​​关键参数对比​​: ​​参数​​ 180定位舵机 360连续旋转舵机 ​​控制目标​​ 精确…

goland怎么取消自动删除未使用的包

1.settings-Go-Imports-取消勾选Optimize imports on the fly2.settings-Tools-取消勾选Optimize imports

halcon基于透视的可变形模型匹配

算子1&#xff0c;create_planar_uncalib_deformable_model_xld***基于平面未校准的轮廓模型算子2&#xff0c;find_planar_uncalib_deformable_model***查找平面未校准可变形模型算子3&#xff0c;projective_trans_contour_xld***将轮廓进行透视变换附加算子 算子4read_conto…

Flink Stream API - 源码开发需求描述

概述 本文介绍如何基于Flink源码进行二次开发&#xff0c;实现一个动态规则引擎系统。通过自定义算子和算子协调器&#xff0c;实现数据流的动态规则计算和协调管理。以此更好理解前面介绍的源码相关文章 项目需求 核心功能 实现一个动态规则引擎&#xff0c;具备以下特性&…

「 CentOS7 安装部署k8s」

一、Linux系统部署K8s还是非常便利的&#xff0c;只需要掌握Linux常用命令&#xff0c;便可以迅速部署&#xff0c;一起来学习一下吧1、运行以下命令更新系统并安装必要工具&#xff1a;yum update -y yum install -y yum-utils device-mapper-persistent-data lvm22、安装Dock…

Disbursement on Quarantine Policy(概率、逆元计算期望)

题目描述There is a train with n rows, and there are m seats per row. All seats are occupied. For some passengers, we know they are being infected with COVID-19 or not. However, for other passengers, we are not sure about their status, and we assume each of…

AI 在金融领域的落地案例

目录 引言 一、信贷风控&#xff1a;基于 LoRA 的 Qwen-7B 模型微调&#xff08;适配城商行审批场景&#xff09; 场景背景 核心代码 1. 环境依赖安装 2. 金融数据集加载与预处理&#xff08;城商行信贷数据&#xff09; 3. LoRA 微调 Qwen-7B 模型 4. 模型推理&#xf…