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

Spring 对数组和集合类的自动注入

核心规则

Spring 处理数组 / 集合类注入时,会根据类型自动匹配并收集容器中的 Bean,具体规则如下:

  1. 数组:根据数组元素类型,在容器中查找所有匹配该类型的 Bean,组成数组注入
  2. Collection 接口及其实现类(如 List、Set):根据集合的泛型元素类型,收集所有匹配该类型的 Bean,封装成对应集合注入
  3. Map(key 为 String 类型):根据 Map 的 value 类型,收集所有匹配类型的 Bean,以 Bean 名称为 key、Bean 实例为 value 组成 Map 注入

代码示例

先定义一个支付处理器接口 PaymentHandler,以及多个实现类(支付宝、微信等):

public interface PaymentHandler {void pay();       // 支付逻辑
}
// 支付宝实现
@Component
public class AlipayHandler implements PaymentHandler {@Overridepublic void pay() { System.out.println("支付宝支付"); }
}
// 微信支付实现
@Component
public class WechatHandler implements PaymentHandler {@Overridepublic void pay() { System.out.println("微信支付"); }
}

注入数组

@Service
public class ArrayService {// 注入所有 PaymentHandler 类型的 Bean ,组成数组@Autowiredprivate PaymentHandler[] paymentHandlers;public void testArray() {System.out.println("=== 数组注入测试 ===");for (PaymentHandler p : paymentHandlers) {p.pay();}}
}

注入 List/Set

如果不需要通过 key 定位,而是要遍历所有实现类(例如执行批量操作、责任链模式),可以用这个

@Service
public class ListAndSetService {// 注入所有 PaymentHandler 类型的 Bean 到 List(有序,可通过@Order控制)@Autowiredprivate List<PaymentHandler> paymentHandlerList;// 注入所有 PaymentHandler 类型的 Bean 到 Set(无序,元素唯一)@Autowiredprivate Set<PaymentHandler> paymentHandlerSet;public void testCollection() {System.out.println("\n=== List注入测试 ===");paymentHandlerList.forEach(PaymentHandler::pay);System.out.println("\n=== Set注入测试 ===");paymentHandlerSet.forEach(paymentHandler -> paymentHandler.pay());}
}

如果需要 List 中的 Bean 按指定顺序排列,可以在实现类上添加 @Order 注解:

@Component
@Order(2) // 数字越小,优先级越高
public class AlipayHandler implements PaymentHandler { ... }@Component
@Order(1)
public class WechatHandler implements PaymentHandler { ... }

注入 Map

@Service
public class MapService {// 注入所有 PaymentHandler 类型的 Bean 到 Map(key=Bean名称,value=Bean实例)@Autowiredprivate Map<String, PaymentHandler> paymentHandlerMap;public void testMap() {System.out.println("\n=== Map注入测试 ===");paymentHandlerMap.forEach((beanName, paymentHandler) -> {System.out.print("[" + beanName + "] ");paymentHandler.pay();});}
}

测试代码

启动类的方法改成这样

    public static void main(String[] args) {ApplicationContext context = SpringApplication.run(J20250721Application.class, args);//测试数组ArrayService arrayService = context.getBean(ArrayService.class);arrayService.testArray();//测试CollectionListAndSetService listAndSetService = context.getBean(ListAndSetService.class);listAndSetService.testCollection();//测试MapMapService mapService = context.getBean(MapService.class);mapService.testMap();}
http://www.dtcms.com/a/291599.html

相关文章:

  • 234、回文链表
  • 使用AI把普通的条形柱状图,丰富成“好看高大上”的条形柱状图
  • 解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题
  • PyQt5—QInputDialog 学习笔记
  • 印度给巴铁断水,中国悄然开建雅鲁藏布江水电站,纯属巧合!
  • Python 标准库之 os 模块全面讲解
  • 大模型为什么出现幻觉?
  • 在Anolis8.6上源码编译安装部署OpenVAS(GVM)未完待续
  • 华为云CCE-PV使用OBS存储类之坑
  • Android NDK ffmpeg 音视频开发实战
  • 语义化版本规范(SemVer)
  • 【计算机组成原理】符号位OF、ZF、CF、SF详解
  • c语言 进阶 动态内存管理
  • stream event
  • Playwright-MCP浏览器会话复用全解析
  • swiper js无缝滚动---解决播放总是有间隔、动画一闪一跳的问题
  • 3.组合式API父子通信
  • 【免费版】开启 Youtube 双语字幕
  • 神经网络——非线性激活
  • Java学习-----AIO模型
  • STM32小实验四--按键控制LED灯
  • tar 解压:Cannot change ownership to uid 1000, gid 1000: Operation not permitted
  • 2021-06-27 51单片机外部中断0控制数码管0自增到9
  • 知识之镜:当检索生成照见人类认知的深渊
  • C++ 分配内存释放内存
  • LinkedList的模拟实现(双向链表Java)
  • JavaScript的引入方式和基础语法的快速入门与学习
  • 单表查询-分页提前获取数据
  • ni-app 对鸿蒙的支持现状
  • 【系统全面】Linux进程——基础知识介绍