首页 > 其他分享 >Spring中Map类型依赖注入的使用

Spring中Map类型依赖注入的使用

时间:2024-07-18 11:53:41浏览次数:15  
标签:Map 依赖 Resource Spring bean ProcessListener 注入

为了详细解释这段代码的装配过程,并编写一份详细的开发文档,我们需要从几个方面进行阐述:Spring框架的依赖注入机制、@Resource注解的作用、Map<String, ProcessListener>类型作为依赖的特别性,以及这段代码在实际开发中的应用和注意事项。

1. Spring框架的依赖注入机制

Spring框架的核心特性之一是依赖注入(Dependency Injection, DI),它允许在运行时动态地将对象所需的依赖项(即其他对象)注入到该对象中,而不是在编写代码时手动创建这些依赖项。Spring支持两种主要的依赖注入方式:构造函数注入(Constructor Injection)和设置方法注入(Setter Injection),本例中使用的是设置方法注入。

2. @Resource注解的作用

@Resource注解是JSR-250规范的一部分,Spring支持这个规范以进行依赖注入。@Resource可以应用于字段、方法(如本例中的setter方法)和构造函数上,用于指定Spring应该注入哪个bean到这个位置。默认情况下,@Resource会根据字段名或方法名进行自动装配,但也可以通过nametype属性明确指定要注入的bean的名称或类型。

3. Map<String, ProcessListener>类型作为依赖的特别性

在Spring中,当依赖项是一个Map类型时,Spring会查找所有符合Map键和值类型的bean,并将它们组装成一个Map注入到指定的位置。在这个例子中,Map<String, ProcessListener>意味着Spring会查找所有ProcessListener类型的bean,并使用这些bean的bean名称(或通过@Qualifier指定的名称)作为Map的键,将bean实例本身作为Map的值。

4. 装配过程

  • 定义**ProcessListener**接口及其实现:首先,需要定义一个ProcessListener接口以及它的一个或多个实现类。这些实现类会被Spring管理为bean。
  • 配置Spring容器:在Spring的配置文件中或通过注解配置(如@Component@Service等),确保ProcessListener的实现类被Spring容器识别为bean。
  • 使用**@Resource**注解:在需要注入ProcessListener列表的类中,定义一个setProcessListenerList方法,并使用@Resource注解标记它。Spring会在运行时查找所有ProcessListener类型的bean,并将它们组装成一个Map,其中键是bean的名称(或自定义的键),值是bean的实例,然后注入到这个方法中。
  • 处理注入的Map:在setProcessListenerList方法中,将传入的Map赋值给某个静态变量(如本例中的EventNotification.processListenerList)或类成员变量,以便在类的其他部分使用。

5. 开发文档

目的
本文档旨在说明如何在Spring框架中使用@Resource注解将多个ProcessListener类型的bean注入到一个Map中,并解释整个装配过程。
背景
在复杂的业务逻辑中,经常需要基于不同条件触发不同的处理逻辑。通过Spring的依赖注入机制,特别是Map类型的注入,可以灵活地将多个处理逻辑组件组装起来,实现解耦和动态配置。
代码示例:

package xyz.yuanjilu.dgs.filling.listener;

import cn.hutool.core.util.StrUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import xyz.yuanjilu.common.utils.StringUtils;

import javax.annotation.Resource;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class FillingEventNotification {
    private static final Logger log = LoggerFactory.getLogger(FillingEventNotification.class);

    private final static String DEFAULT_PROCESS_LISTENER = "defaultFillingProcessListener";

    private static Map<String, FillingProcessListener> fillingProcessListenerList;

    @Resource
    public void setProcessListenerList(Map<String, FillingProcessListener> fillingProcessListenerList) {
        FillingEventNotification.fillingProcessListenerList = fillingProcessListenerList;
    }

    public static void notice(String taskId,ListenerType listenerType){
        //根据任务ID找到对应的配置规则,并获取配置解析bean的信息
        String listenerBean = "";
        if (StrUtil.isBlank(listenerBean)) {
            listenerBean = DEFAULT_PROCESS_LISTENER;
        }
        switch (listenerType){
            case beforeTaskFilling:
                break;
        }
    }

    public static Map<String,String> getFillingProcessListenerEntrySet() {
        return fillingProcessListenerList.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getBeanName()));
    }

    public enum ListenerType {
        beforeTaskFilling,
    }
}

步骤

  1. 定义接口和实现
    • 定义ProcessListener接口,规定处理逻辑的方法。
    • 创建ProcessListener的实现类,并使用@Component@Service等注解标记它们为Spring管理的bean。
  2. 配置Spring容器
    • 确保Spring的配置(无论是XML配置还是基于注解的配置)能够扫描到ProcessListener的实现类。
  3. 使用**@Resource**注入Map
    • 在需要接收ProcessListener列表的类中,定义一个Map类型的成员变量或静态变量,以及一个带有@Resource注解的setter方法。
    • Spring会自动查找所有ProcessListener类型的bean,并将它们组装成一个Map注入到这个setter方法中。
  4. 使用注入的Map
    • 在类的其他部分,可以通过访问这个Map来调用不同的ProcessListener实现,实现业务逻辑。

注意事项

  • 确保ProcessListener的实现类被Spring容器正确管理。
  • 使用@Resource注解时,可以通过name属性明确指定要注入的bean的名称,以处理重名的情况。
  • 静态变量注入在单元测试中可能会带来问题,因为它不是由Spring容器管理的实例字段,因此建议尽可能使用实例变量进行依赖注入。

通过以上步骤和注意事项,可以有效地在Spring框架中利用@Resource注解实现Map类型的依赖注入,进而实现灵活的业务逻辑处理。

标签:Map,依赖,Resource,Spring,bean,ProcessListener,注入
From: https://www.cnblogs.com/kongyang/p/18309206

相关文章

  • Spring与设计模式实战之策略模式
    Spring与设计模式实战之策略模式引言在现代软件开发中,设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案,帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用,并通过实际例子展示如何通过Spring的特性来实现和管理策......
  • 深入浅出Spring Web MVC:从零开始构建你的第一个Web应用
    深入浅出SpringWebMVC:从零开始构建你的第一个Web应用大家好,今天我们来聊聊SpringWebMVC,这是一个非常强大的框架,用于构建JavaWeb应用。我们将从零开始,逐步构建一个简单的Web应用,帮助大家理解SpringWebMVC的核心概念和使用方法。什么是SpringWebMVC?SpringWebMVC是Spri......
  • 深入探讨:使用 Spring AOP 实现 Lock4j 的声明式和编程式分布式锁
    深入探讨:使用SpringAOP实现Lock4j的声明式和编程式分布式锁在现代分布式系统中,分布式锁是一个非常重要的概念。它可以帮助我们在多个节点之间协调资源访问,防止数据不一致和竞争条件。今天,我们将深入探讨如何使用Lock4j和SpringAOP来实现声明式和编程式的分布式锁。什......
  • 深入解析 Spring Boot 项目中的 Maven 依赖冲突及其解决方案
    深入解析SpringBoot项目中的Maven依赖冲突及其解决方案在使用SpringBoot开发项目时,Maven作为构建工具为我们提供了极大的便利。然而,随着项目规模的扩大和依赖项的增多,依赖冲突问题也随之而来。本文将深入探讨SpringBoot项目中Maven依赖冲突的原因、检测方法以及解......
  • 深入探讨 Spring 6 的面向切面编程(AOP)
    深入探讨Spring6的面向切面编程(AOP)大家好,今天我们来聊聊Spring6中的面向切面编程(AOP)。AOP是Spring框架中一个非常强大的特性,它可以帮助我们在不改变原有代码的情况下,添加一些通用的功能,比如日志记录、事务管理、安全检查等。什么是AOP?AOP,全称Aspect-OrientedProgra......
  • 使用Spring Boot AOP和自定义注解优雅实现操作日志记录
    使用SpringBootAOP和自定义注解优雅实现操作日志记录大家好,今天我们来聊聊如何在SpringBoot项目中,通过AOP(面向切面编程)和自定义注解,优雅地实现操作日志记录。操作日志对于系统的可维护性和安全性至关重要,它能帮助我们追踪用户行为,排查问题。什么是AOP?AOP,全称Aspect-Oriented......
  • 使用Spring Boot实现图形验证码:从零开始的详细教程
    使用SpringBoot实现图形验证码:从零开始的详细教程在现代Web应用中,图形验证码是一种常见的防止机器人和恶意攻击的手段。今天,我们将深入探讨如何在SpringBoot项目中实现图形验证码。通过这个教程,你将学会如何生成和验证图形验证码,并将其集成到你的SpringBoot应用中。一、项目......
  • SpringBoot与Thymeleaf模板技术整合
    以下是一个简单的SpringBoot整合Thymeleaf的入门案例:1.创建一个SpringBoot项目,并添加Thymeleaf依赖。org.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web2.在src/main/resources/templates目录下创建一个HTML模......
  • 基于java+springboot+vue的影视影院订票选座管理系统(源码+LW+部署讲解)
    前言......
  • 基于java+springboot+vue的学生毕业离校系统(源码+LW+部署讲解)
    前言......