【Spring】Spring DI(依赖注入)详解—集合类型的注入——List、Set、Map的配置与注入

一、引言

Spring依赖注入不仅能简化对象的创建和管理,还能使得代码更加灵活和可维护。尤其是在处理集合类型的依赖时,Spring的DI机制提供了更为灵活的方式来管理和注入多个依赖。

1.1 依赖注入的重要性

在大型应用中,类与类之间的关系往往是复杂的。例如,一个电商平台的订单服务可能依赖于多个支付方式、多个商品服务和多个用户服务。在这种情况下,手动管理这些依赖关系会导致代码冗长且难以维护。

使用Spring的依赖注入,我们可以轻松地将多个依赖注入到一个类中,而无需在代码中手动创建这些依赖。通过配置文件或注解,Spring容器能够自动管理这些依赖关系。

1.2 生活中的类比

可以将集合类型的注入类比于一个厨房中的厨具。想象一下,你的厨房里有多种烹饪工具(刀具、锅具、调料等),而你需要在烹饪时根据不同的需求选择不同的工具。依赖注入就像是一个厨师助手,他会根据你要做的菜品,自动为你准备好所需的所有工具,而你只需专注于烹饪本身。

二、Spring集合类型的依赖注入

Spring支持通过依赖注入将集合类型(如ListSetMap)注入到类中。这样,我们可以轻松地管理多个相同类型的依赖。以下是对每种集合类型的详细介绍。

2.1 List的注入

List是一种有序的集合,可以包含重复元素。我们可以将多个相同类型的bean注入到一个List中。

示例代码
  1. 定义接口和实现类

    // PaymentMethod.java
    public interface PaymentMethod {
    void pay();
    }

    // CreditCardPayment.java
    public class CreditCardPayment implements PaymentMethod {
    @Override
    public void pay() {
    System.out.println("Payment made using Credit Card.");
    }
    }

    // PayPalPayment.java
    public class PayPalPayment implements PaymentMethod {
    @Override
    public void pay() {
    System.out.println("Payment made using PayPal.");
    }
    }

  2. 定义依赖类

    // OrderService.java
    import java.util.List;

    public class OrderService {
    private List<PaymentMethod> paymentMethods;

     // 使用setter方法注入List
     public void setPaymentMethods(List<PaymentMethod> paymentMethods) {
         this.paymentMethods = paymentMethods;
     }
    
     public void processOrder() {
         System.out.println("Processing order...");
         for (PaymentMethod paymentMethod : paymentMethods) {
             paymentMethod.pay(); // 调用每种支付方式的pay方法
         }
     }
    

    }

  3. Spring配置文件

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <!-- 定义支付方式的bean -->
     <bean id="creditCardPayment" class="CreditCardPayment" />
     <bean id="paypalPayment" class="PayPalPayment" />
    
     <!-- 定义OrderService bean,并注入List -->
     <bean id="orderService" class="OrderService">
         <property name="paymentMethods">
             <list>
                 <ref bean="creditCardPayment" />
                 <ref bean="paypalPayment" />
             </list>
         </property>
     </bean>
    
    </beans>
  4. 启动Spring容器

    // Main.java
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Main {
    public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    OrderService orderService = (OrderService) context.getBean("orderService");
    orderService.processOrder();
    }
    }

运行结果
Processing order...
Payment made using Credit Card.
Payment made using PayPal.
2.2 Set的注入

Set是一种不允许重复元素的集合。我们可以将多个相同类型的bean注入到一个Set中,Spring会自动处理重复的元素。

示例代码
  1. 定义依赖类

    // NotificationService.java
    import java.util.Set;

    public class NotificationService {
    private Set<String> notifications;

     // 使用setter方法注入Set
     public void setNotifications(Set<String> notifications) {
         this.notifications = notifications;
     }
    
     public void sendNotifications() {
         System.out.println("Sending notifications:");
         for (String notification : notifications) {
             System.out.println(notification);
         }
     }
    

    }

  2. Spring配置文件

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <!-- 定义NotificationService bean,并注入Set -->
     <bean id="notificationService" class="NotificationService">
         <property name="notifications">
             <set>
                 <value>Email Notification</value>
                 <value>SMS Notification</value>
                 <value>Push Notification</value>
             </set>
         </property>
     </bean>
    
    </beans>
  3. 启动Spring容器

    // Main.java
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Main {
    public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    NotificationService notificationService = (NotificationService) context.getBean("notificationService");
    notificationService.sendNotifications();
    }
    }

运行结果
Sending notifications:
Email Notification
SMS Notification
Push Notification
2.3 Map的注入

Map是一种键值对集合,可以存储多个元素,并通过键来访问对应的值。我们可以将多个相同类型的bean注入到一个Map中。

示例代码
  1. 定义依赖类

    // UserService.java
    import java.util.Map;

    public class UserService {
    private Map<String, String> users;

     // 使用setter方法注入Map
     public void setUsers(Map<String, String> users) {
         this.users = users;
     }
    
     public void printUsers() {
         System.out.println("User List:");
         for (Map.Entry<String, String> entry : users.entrySet()) {
             System.out.println("Username: " + entry.getKey() + ", Full Name: " + entry.getValue());
         }
     }
    

    }

  2. Spring配置文件

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <!-- 定义UserService bean,并注入Map -->
     <bean id="userService" class="UserService">
         <property name="users">
             <map>
                 <entry key="john_doe" value="John Doe" />
                 <entry key="jane_doe" value="Jane Doe" />
             </map>
         </property>
     </bean>
    
    </beans>
  3. 启动Spring容器

    // Main.java
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Main {
    public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) context.getBean("userService");
    userService.printUsers();
    }
    }

运行结果
User List:
Username: john_doe, Full Name: John Doe
Username: jane_doe, Full Name: Jane Doe

三、总结

通过上述示例,我们展示了如何使用Spring的依赖注入来管理集合类型的依赖(ListSetMap)。这种方式使得我们能够轻松地将多个相同类型的bean注入到一个类中,提升了代码的可读性和可维护性。

在实际应用中,集合类型的注入非常常见,尤其是在需要处理多个相同类型的服务、配置或数据时。

相关推荐
佛系小嘟嘟2 分钟前
Android Jetpack Compose开发小组件【入门篇】
android·开发语言·android jetpack·小组件
开心工作室_kaic3 分钟前
springboot548二手物品交易boot代码(论文+源码)_kaic
前端·数据库·vue.js·后端·html5
Java知识日历1 小时前
【内含例子代码】Spring框架的设计模式应用(第二集)
java·开发语言·后端·spring·设计模式
尘浮生3 小时前
Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven
Java知识技术分享4 小时前
spring boot通过文件配置yaml里面的属性
java·spring boot·后端
军训猫猫头4 小时前
36.Add的用法 C#例子
开发语言·c#
Demons_kirit4 小时前
Spring Boot + Redis + Sa-Token
spring boot·redis·后端
一休哥助手4 小时前
深入解析Spring Boot项目的类加载与启动流程
java·spring boot·后端
丁总学Java4 小时前
定义一个名为 MyCache 的 Spring 配置类
java·spring