为什么使用bean注解创建IRule,就可以定义负载均衡规则

@Bean
public IRule randomRule() {
return new RandomRule();
}
当您在Spring Cloud中定义一个IRule的Bean时,您实际上是在配置Ribbon的负载均衡规则。这个Bean会被注入到Ribbon客户端中,并在客户端发起服务调用时用于决定如何选择目标服务实例。


这里需要对注入的概念重新回顾一下:

注入==》依赖注入==》控制反转==》控制对象生成的过程不再由程序员主动定义,而是交由spring容器控制

  1. 正向的控制是通过new关键字主动的创建一个对象
    是人在控制对象的创建和销毁过程
  2. 控制反转是通过@Bean将对象注册到spring容器中,通过@Autowired将容器中的对象注入
    是spring容器在控制对象的创建和销毁过程

控制反转的案例

假设有接口A,接口实现类B,接口实现类C
接口A定义负载均衡基础规则
B实现了负载均衡-轮询
C实现了负载均衡-随机


使用new主动创建:
首先使用轮询
A test = new B();
创建了至少20个new B();在不同的位置
之后,需要修改规则为随机
此时,需要将至少20个在不同的位置的new B();更改为new C();
异常繁琐


使用控制反转:
首先使用轮询
先用@bean注解定义注册到Spring容器的接口实现类是B

@Bean
public A test() {return  new B();   
}

之后,使用@Autowired将实现类出注入,创建的过程完全由spring容器控制

@Autowired
A test;

使用了至少20个,但都是依赖注入

之后,需要修改规则为随机
此时,只需要将@Bean注册的方法修改成随机就可以了

@Bean
public A test() {return  new C();   
}

补充
提问:
如何实现,当用户不定义bean时使用默认的A接口的B类,用户定义Bean返回的是什么就使用什么进行依赖注入

回答:
要实现这样的功能,你可以使用Spring框架的自动配置和条件化Bean定义。以下是一个简单的示例来说明如何实现这个需求:

定义默认实现:首先,你需要有一个默认的A接口的实现类a。

public interface A {// ... 接口方法 ...
}@Component
public class DefaultA implements A {// ... 实现方法 ...
}

在这个例子中,DefaultA类实现了A接口,并且使用了@Component注解,使其成为Spring容器中的一个Bean。
2. 条件化用户自定义Bean:你可以使用@Conditional注解来根据条件决定是否创建某个Bean。例如,你可以检查是否存在用户自定义的A接口的实现。

@Configuration
public class AConfig {@Bean@ConditionalOnMissingBean(A.class)public A defaultA() {return new DefaultA();}@Bean@ConditionalOnBean(A.class)public A userDefinedA(A a) {return a; // 返回用户定义的Bean}
}

在这个配置类中,我们定义了两个Bean。
第一个Bean defaultA会在没有其他A类型的Bean存在时被创建(即用户没有定义自己的Bean)。
第二个Bean userDefinedA则会在存在A类型的Bean时被创建,这时它会返回用户定义的Bean。
3. 使用:现在,当用户没有定义自己的A接口实现时,Spring会注入DefaultA的实例。如果用户定义了自己的实现,Spring会注入用户定义的Bean。

@Service
public class SomeService {private final A a;@Autowiredpublic SomeService(A a) {this.a = a;}// ... 使用a的方法 ...
}

在这个例子中,SomeService的构造函数会注入一个A类型的Bean。根据用户是否定义了自己的Bean,注入的可能是DefaultA的实例或者是用户定义的Bean。

通过这种方式,你可以实现当用户不定义Bean时使用默认的A接口的a类,而用户定义Bean时则返回用户定义的内容进行依赖注入。

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

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

相关文章

ELK原理详解

ELK原理详解 一、引言 在当今日益增长的数据量和复杂的系统环境中,日志数据的收集、存储、分析和可视化成为了企业运营和决策不可或缺的一部分。ELK(Elasticsearch、Logstash、Kibana)堆栈凭借其高效的性能、灵活的扩展性和强大的功能&…

使用ROW_NUMBER()分组遇到的坑

1、再一次清洗数据时,需要过滤重复数据,使用了ROW_NUMBER() 来分组给每组数据排序号 在获取每组的第一行数据 with records as(select cc.F_Id as Id,REPLACE(cc.F_CNKITitle,char(10),1) as F_CNKITitle,REPLACE(REPLACE(cc.F_Special,专题&#xff1…

Kubernetes——基础认识

目录 前言 什么是云原生 云元素 K8s与中间件以及微服务之间的关系 Kubernetes发展历史 一、简介 1.Kubernetes是什么 2.为什么要使用Kubernetes 3.Kubernetes特性 3.1自我修复 3.2弹性伸缩 3.3自动部署和回滚 3.4服务发现和负载均衡 3.5集中化配置管理和密钥管理…

车载测试系列:车载测试流程

车载测试流程是保证软件质量的重要支撑,优秀的团队都必须拥有规范的流程体系支撑,它能够约束测试人员的测试行为,约束测试环境的测试精度,提升测试的覆盖度,保证团队成员工作的协调性。 该测试流程建立的依据&#xf…

书生浦语训练营第2期-第7节笔记

一、为什么要研究大模型的评测? 首先,研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多个通用任务上已经达到或超越了人类水平,但仍然存在质疑,即这些模型的能力是否只是对训练数据的…

二分查找向下取整导致的死循环69. x 的平方根

二分查找向下取整导致的死循环 考虑伪题目:从数组arr中查找出目标元素target对应的下标,如果数组中不存在目标元素,找 到第一个元素值小于target的元素的下标。 编写二分查找算法如下: Testvoid testBinarySearch(){int[] arr n…

java如何打印数组所有元素

java如何打印数组所有元素 用for循环的话 语法格式是 for(int i0;i<数组名.length;i) { System.out.prontln(数组名[i]); } 如果用while循环 先定义一个变量&#xff0c;变量的值等于0 假定变量名为j int j0; while(j<数组名.length) { System.out.println(数组…

Web 功能以及源码讲解

Web 功能以及语言讲解 培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 短视频制作群&#xff1a; 744125867极…

leetcode203-Remove Linked List Elements

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&…

Eigen中的刚体变换表达

在Eigen中&#xff0c;旋转矩阵、变换矩阵、欧拉角都可以表示为Eigen库中的特定类型的矩阵。 1、旋转矩阵 旋转矩阵通常用于表示三维空间中的旋转操作。在Eigen中&#xff0c;可以使用Eigen::Matrix3d类型来表示三维的旋转矩阵。通常&#xff0c;旋转矩阵是一个正交矩阵&…

网络新手如何上手水牛社软件?我的建议与看法

水牛社是一款专为电脑用户设计的软件&#xff0c;拥有明确的著作权&#xff0c;其核心功能在于发布和整合各类网络活动任务资源、教程等&#xff0c;内容多元且不设固定分类。其靠谱程度取决于你对软件的了解程度和个人需求的适配性。 软件内部包含五个主要栏目&#xff0c;大…

轮廓提取、矩形标记时,点的位置需要重标

在下图中的0&#xff0c;3&#xff0c;1&#xff0c;2位置如何变换成0&#xff0c;1&#xff0c;2&#xff0c;3 先显示结果&#xff1a; 变换之后图&#xff1a; 这边提供两种解决方案&#xff1a; 第一种&#xff1a;将坐标值相加求和&#xff0c;采用冒泡排序实现从小到大…

使用固定公网地址远程访问开源服务器运维管理面板1Panel管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

顺序表的实现(迈入数据结构的大门)(完整代码)

seqlist.h #pragma once typedef int SLDataType;#include<stdio.h> #include<stdlib.h> #include<assert.h>typedef struct SeqList {SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量 }SL;//初始化和销毁 void SLInit(SL* ps); void SL…

ReentrantLock的原理

总结&#xff1a; ReentrantLock 的基本实现可以概括为&#xff1a;先通过 CAS 尝试获取锁。如果此时已经有线程占据了锁&#xff0c;那就加入 AQS 队列并且被挂起。当锁被释放之后&#xff0c;排在 CLH 队列队首的线程会被唤醒&#xff0c;然后 CAS 再次尝试获取锁。在这个时候…

reqwest - Rust HTTP Client

文章目录 关于 reqwest使用添加依赖Get 请求Post 请求FormsJSON 关于 reqwest An easy and powerful Rust HTTP Client github : https://github.com/seanmonstar/reqwest文档&#xff1a;https://docs.rs/reqwest/latest/reqwest/ 特点 Async and blocking ClientsPlain bo…

c语言循环题目

c语言循环题目 已知sinx的近似计算公式如下sin xx- x3/3! x’/5!-x7/7!.(-1)n-1x2n-1/(2n-1)!其中x为弧度&#xff0c;n为正整数。编写程序根据用户输入的x和n的值&#xff0c;利用上述近似计算公式计算sinx的近似值&#xff0c;要求输出结果小数点后保留8位 int main() {in…

Excel文件解析---超大Excel文件读写

1.使用POI写入 当我们想在Excel文件中写入100w条数据时&#xff0c;使用XSSFWorkbook进行写入时会发现&#xff0c;只有将100w条数据全部加载到内存后才会用write()方法统一写入&#xff0c;效率很低&#xff0c;所以我们引入了SXXFWorkbook进行超大Excel文件读写。 通过设置 …

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题&#xff1a;136.只出现一次的数字两次遍历&#xff08;O(numsSize^2)&#xff09;位运算 第2题&#xff1a;202.快乐数快慢指针记录历史数据 第3题&#xff1a;53.最大子数组和暴力求解&#xff08;超时&#xff09;动态规划分治 第1题&#xff1…

每日Attention学习3——Cross-level Feature Fusion

模块出处 [link] [code] [PR 23] Cross-level Feature Aggregation Network for Polyp Segmentation 模块名称 Cross-level Feature Fusion (CFF) 模块作用 双级特征融合 模块结构 模块代码 import torch import torch.nn as nnclass BasicConv2d(nn.Module):def __init__(…