当前位置: 首页 > 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.lryc.cn/news/594961.html

相关文章:

  • 机器学习初学者理论初解
  • Oracle 数据库共享池与大池调优指南
  • ElasticSearch:不停机更新索引类型(未验证)
  • Django基础(五)———模板结构
  • 中小型企业如何选择合适的WMS系统?
  • 如何用DispatcherTimer提高运行总时间的精确度
  • AI探索 | 基于 Node.js 开发 MCP 客户端+服务端及优秀项目分享
  • Node.js- node管理工具nvm
  • Spring @RequestBody注解详解与实践
  • Dockerfile 完全指南:从入门到精通
  • 西门子 S7-1500 信号模块硬件配置全解析:从选型到实战
  • (10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操
  • 使用 Tailwind CSS 控制元素在移动端不显示
  • 【LuckiBit】macOS/Linux 常用命令大全
  • Jenkins pipeline触发下游流水线
  • 用Java 代码实现一个简单的负载均衡逻辑
  • 2025最新版PyCharm for Mac统一版安装使用指南
  • springcloud -- 微服务02
  • 【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
  • 【c++】leetcode438 找到字符串中所有字母异位词
  • Three.js 从零入门:构建你的第一个 Web 3D 世界
  • 小孙学变频学习笔记(十一)关于V/F曲线的讨论
  • 本地部署AI新选择!LocalAI+cpolar轻松实现隐私安全的远程访问
  • 深入解析Hadoop YARN:三层调度模型与资源管理机制
  • 星游路-个人日志-学习积累法
  • 【PTA数据结构 | C语言版】验证六度空间理论
  • Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录
  • Hadoop数据完整性校验机制深度解析:CRC32校验和与后台扫描线程
  • 低空经济展 | 约克科技携小型化测试设备亮相2025深圳eVTOL展
  • Spring Boot 3核心技术面试指南:从迁移升级到云原生实战,9轮技术攻防(含架构解析)