Java Spring 框架技术从入门到放弃:Spring生态之Spring 注入数据集合学习笔记(重点标注版)
一、核心概念与生活案例
数据集合注入:将数组、List、Set、Map 等集合类型作为依赖注入到 Bean 中。
生活案例:餐厅管理系统中,服务员需要管理不同类型的订单(集合),厨房需要记录所有烹饪设备(Map)。
二、集合注入的四大类型
1. 数组注入(Array)
核心:注入固定顺序的同类型元素。
案例:餐厅的每日特价菜(数组):
<bean id="waiter" class="com.example.Waiter">
<property name="dailySpecials">
<array>
<value>黑椒牛排</value>
<value>海鲜意面</value>
</array>
</property>
</bean>
关键特性:
- 顺序敏感:元素按 XML 定义顺序排列。
- 类型统一:数组元素必须为同一类型。
2. List 注入(有序集合)
核心:注入有序且允许重复的元素。
案例:餐厅的员工排班表(List):
@Service
public class Manager {
@Autowired
private List<Employee> schedule; // 重点:@Autowired 自动注入 List
public void printSchedule() {
schedule.forEach(Employee::work);
}
}
最佳实践:
- 使用
@Autowired
直接注入 List,Spring 自动匹配所有符合条件的 Bean。 - 通过
@Order
注解控制元素顺序。
3. Set 注入(无序集合)
核心:注入无序且唯一的元素。
案例:餐厅的烹饪设备(Set):
<bean id="kitchen" class="com.example.Kitchen">
<property name="equipments">
<set>
<ref bean="oven"/>
<ref bean="stove"/>
</set>
</property>
</bean>
特性对比:
类型 | 顺序性 | 唯一性 | 典型场景 |
---|---|---|---|
List | 有 | 允许重复 | 订单队列、任务列表 |
Set | 无 | 强制唯一 | 设备集合、权限角色 |
4. Map 注入(键值对集合)
核心:注入键值对映射关系。
案例:餐厅的设备与供应商(Map):
@Service
public class Purchasing {
@Autowired
private Map<String, Supplier> equipmentSuppliers; // 重点:Map 注入
public String getSupplier(String equipment) {
return equipmentSuppliers.get(equipment).getName();
}
}
关键特性:
- 键类型:支持 String、Class 等类型。
- 值类型:可以是 Bean 或字面量。
三、高级注入方式
1. Properties 注入
核心:注入键值对配置,通常来自外部文件。
案例:餐厅的营业时间配置(jdbc.properties):
<context:property-placeholder location="classpath:business.properties"/>
<bean id="restaurant" class="com.example.Restaurant">
<property name="openingHours" value="${business.hours}"/>
</bean>
2. SpEL 表达式注入
核心:通过 Spring 表达式语言动态生成集合。
案例:餐厅的促销活动时间(SpEL 生成日期范围):
@Value("#{T(java.time.LocalDate).now().plusDays(7)}")
private LocalDate promotionEnd;
四、最佳实践与避坑指南
-
构造器注入集合(推荐):
@Service public class Chef { private final List<Recipe> recipes; @Autowired public Chef(List<Recipe> recipes) { // 重点:集合依赖通过构造器注入 this.recipes = recipes; } }
-
避免空集合:
- 使用
@Nonnull
注解(Lombok)或default-empty
XML 属性。
<util:list id="emptyMenu" default-value="无菜品"/>
- 使用
-
类型安全检查:
- 使用泛型约束集合类型(如
Map<String, Equipment>
)。 - XML 中通过
<list element-type="com.example.Dish">
指定元素类型。
- 使用泛型约束集合类型(如
五、典型应用场景
六、预习:集合注入进阶知识
-
Spring Boot 自动配置:
- 使用
@ConfigurationProperties
绑定集合类型配置:
@Configuration @ConfigurationProperties(prefix="restaurant.menu") public class MenuConfig { private List<String> dishes; }
- 使用
-
与 MyBatis 集成:
- 通过
@MapperScan
注入多个 DAO 接口(集合形式)。
- 通过
-
响应式编程:
- Spring WebFlux 中使用
Flux
/Mono
处理流式集合。
- Spring WebFlux 中使用
-
云原生场景:
- Kubernetes 中通过 ConfigMap 注入集合类型配置。
总结:集合注入是 Spring 依赖管理的重要组成部分,掌握数组、List、Set、Map 的注入方式,能有效处理复杂业务场景。重点关注 @Autowired
对集合的自动匹配,以及 SpEL 和外部属性文件的灵活运用。