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

巧妙注入的奥秘:在 Spring 中优雅地使用 List 和 Map

文章目录

      • 一、注入 List:同类项,一次拿下
      • 二、注入 Map:当键值对遇上多态
      • 三、进阶:使用 Qualifier 灵活注入
      • 四、总结
      • 总结
      • 推荐阅读文章

在 Spring 框架里,我们经常需要将不同的组件组织到集合中,比如在注入多个服务实例时,将它们置于一个 ListMap 集合中供后续灵活调用。这种设计不仅简洁且可扩展,同时也让代码更具可维护性。今天,我们就来一起看看如何在 Spring 中用最优雅的方式注入这些集合!

一、注入 List:同类项,一次拿下

在 Spring 中,List 注入可以让我们轻松地将一组同类的 Bean 注入到一个集合中。假设我们有多个实现了 OrderService 接口的类:

public interface OrderService {
    void processOrder();
}

@Component
public class RegularOrderService implements OrderService {
    public void processOrder() {
        System.out.println("Processing regular order");
    }
}

@Component
public class SpecialOrderService implements OrderService {
    public void processOrder() {
        System.out.println("Processing special order");
    }
}

我们可以在使用这些实现的类中通过 List<OrderService> 来一键注入:

@Component
public class OrderProcessor {
    private final List<OrderService> orderServices;

    public OrderProcessor(List<OrderService> orderServices) {
        this.orderServices = orderServices;
    }

    public void processAllOrders() {
        orderServices.forEach(OrderService::processOrder);
    }
}

通过这种方式,Spring 会自动把实现 OrderService 的所有 Bean 注入到 orderServices 列表中。这样一来,不管有多少个实现,只要实现 OrderService,我们就不需要额外修改代码,非常灵活。

二、注入 Map:当键值对遇上多态

如果我们希望按名称获取服务,比如用 Map<String, OrderService>,也是很容易实现的。假如 RegularOrderServiceSpecialOrderService 分别需要按名称访问,那么我们只需改写注入为 Map 类型:

@Component
public class OrderProcessorWithMap {
    private final Map<String, OrderService> orderServiceMap;

    public OrderProcessorWithMap(Map<String, OrderService> orderServiceMap) {
        this.orderServiceMap = orderServiceMap;
    }

    public void processOrderByType(String type) {
        OrderService service = orderServiceMap.get(type);
        if (service != null) {
            service.processOrder();
        } else {
            System.out.println("Unknown order type");
        }
    }
}

在使用时,只需指定名称即可找到对应的 OrderService。Spring 会自动将 Bean 名称作为 Map 的键,实例作为值,非常方便地按需调用!

三、进阶:使用 Qualifier 灵活注入

当我们想要对注入的集合进行精确控制时,可以使用 @Qualifier 注解。比如我们只希望注入特殊的 OrderService 实现类:

@Component
public class FilteredOrderProcessor {
    private final List<OrderService> specialServices;

    public FilteredOrderProcessor(@Qualifier("special") List<OrderService> specialServices) {
        this.specialServices = specialServices;
    }

    public void processSpecialOrders() {
        specialServices.forEach(OrderService::processOrder);
    }
}

在这里,我们可以通过 @QualifierOrderService 添加一个名称,在需要的时候选择性注入,避免了注入无关的实现。

四、总结

利用 Spring 的 ListMap 注入功能,可以轻松管理多实现类的依赖,增强代码的模块化和可读性。尤其在扩展服务的场景下,使用集合注入能够让代码随需求增长而从容扩展。


希望这样的讲解能让你在实际项目中得心应手地管理多类服务注入,让代码更整洁优雅!

总结

作为一名拥有多年开发经验的老程序员,我深知,技术的学习永无止境,项目的挑战也源源不断。通过这篇文章,我希望你能从我的经验中获得一些启发,避免那些常见的弯路,让你的开发之路走得更加顺畅。如果你能将这些技巧运用到自己的项目中,相信一定能提高自己的开发效率,并在团队中脱颖而出。

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
  • HTTP、HTTPS、Cookie 和 Session 之间的关系
  • 什么是 Cookie?简单介绍与使用方法
  • 什么是 Session?如何应用?
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
  • 如何理解应用 Java 多线程与并发编程?
  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • 如何理解线程安全这个概念?
  • 理解 Java 桥接方法
  • Spring 整合嵌入式 Tomcat 容器
  • Tomcat 如何加载 SpringMVC 组件
  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
  • 线程 vs 虚拟线程:深入理解及区别
  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
  • Java 中消除 If-else 技巧总结
  • 线程池的核心参数配置(仅供参考)
  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)
  • Java 枚举的几个常用技巧,你可以试着用用

http://www.kler.cn/a/394847.html

相关文章:

  • benchmarksql5.0 测试工具如何在达梦上能够跑起来?
  • 华为管理变革之道:管理制度创新
  • Mac上Stable Diffusion的环境搭建(还算比较简单)
  • windows C++ TCP客户端
  • Centos下的OpenSSH服务器和客户端
  • AIA - IMSIC之二(附IMSIC处理流程图)
  • 【SpringBoot】20 同步调用、异步调用、异步回调
  • 【学习】【HTML】块级元素,行内元素,行内块级元素
  • macos 搭建自己的git pages
  • awk是一种在 Linux 和 Unix 系统中非常强大且常用的文本处理工具
  • Linux( 权限+特殊权限 图片+大白话)
  • macOS系统下使用SQLark连接达梦数据库
  • flutter插件:录制系统播放的声音
  • Docker compose部署portainer
  • 【Python进阶】Python中的数据库交互:ORM技术与SQLAlchemy
  • 国产系统给在线的Word文件创建表格
  • unity3d————接口基础知识点
  • STM32 创建一个工程文件(寄存器、标准库)
  • Android在使用RecycylerView开发中,设置item单选效果,并且设置默认选中第一个
  • fastadmin多个表crud连表操作步骤
  • 《鸿蒙生态:开发者的机遇与挑战》
  • ddl/dml/dcl
  • 【计算机网络】【传输层】【习题】
  • 子集选择——基于R语言实现(最优子集选择法、逐步回归法、Lasso回归法、交叉验证法)
  • 通过vmware虚拟机安装和调试编译好的 ReactOS
  • 使用etl工具kettle的日常踩坑梳理之一、从mysql中导出数据