Spring高级应用之注入各类集合

简介:

    先定义一个测试类,由于本文将要介绍注入各种集合时如何配置,故这个类包含各种集合,类名和属性名不好取,没有特殊含义:

?
1
2
3
4
5
6
7
8
9
public  class  Test {
     private  List<String> listTest;
     private  Map<String, Object> mapTest;
     private  Set setTest;
     private  String[] arrayTest;
     private  Properties propertiesTest;
     //下面是各个属性的setter,此处省略
     //......
}

    Test类中,分别定义了List,Map,Set,Array等5种集合类型的属性,下面在Spring配置文件中,分别为这些类型的属性注入值:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
< bean  id = "test"  class = "com.abc.Test" >
     <!-- List类型的属性 -->
     < property  name = "listTest" >
         <!-- 为list类型的属性注入值时,使用<list>元素 -->
         < list >
             <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 -->
             < value >ListA</ value >
             < value >ListB</ value >
             < value >ListC</ value >
         </ list >
     </ property >
     
     <!-- Map类型的属性 -->
     < property  name = "mapTest" >
         <!-- 为map类型的属性注入值时,使用<map>元素 -->
         < map >
             <!-- 每一个<entry>都为<map>配置一个K-V对,同样, -->
             < entry  key = "key1"  value = "value1"  />
             <!-- 下面这个value指向了在此Spring文件中定义的另一个叫object的Bean -->
             < entry  key = "key2"  value-ref = "object"  />
         </ map >
     </ property >
     
     <!-- Set类型的属性 -->
     < property  name = "setTest" >
         <!-- 为set类型的属性注入值时,使用<set>元素 -->
         < set >
             <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 -->
             < value >SetA</ value >
             <!-- 下面是一个嵌套Bean的定义。关于什么是嵌套Bean,请看:http://my.oschina.net/itblog/blog/204378 -->
             < bean  class = "com.abc.OtherBean1"  />
             <!-- 下面引用了此Spring文件中定义的另一个Bean -->
             < ref  local = "com.abc.OtherBean2"  />
         </ set >
     </ property >
     
     <!-- Properties类型的属性 -->
     < property  name = "propertiesTest" >
         < props >
             <!-- 每个<prop>元素指定一个属性项,其中key指定属性名 -->
             < prop  key = "prop1" >value1</ prop >
             < prop  key = "prop2" >value2</ prop >
         </ props >
     </ property >
     
     <!-- 数组类型的属性 -->
     < property  name = "arrayTest" >
         <!-- 为数组类型的属性注入值时,使用<list>元素 -->
         < list >
             <!-- 只要类型满足,每个<value>,<ref>,<bean>都可以配置一个list的元素 -->
             < value >Array1</ value >
             < bean  class = "com.abc.OtherBean1"  />
             < ref  local = "com.abc.OtherBean2"  />
         </ list >
     </ property >
</ bean >

    由于集合元素有可以是基本类型值、引用容器中其他Bean、嵌套Bean或集合属性等,因此<list>、<set>、和<key>元素又可以接受如下的子元素:

  • value:指定集合元素是基本数据类型值或字符串类型值

  • ref:指定集合元素是容器中另一个Bean实例

  • bean:指定集合元素是一个嵌套Bean

  • list、set、map及props:指定集合元素值又是集合

    <props>元素适用于配置Properties类型的属性,Properties类型时一种特殊的类型,其key和value都只能是字符串,故Spring配置Properties类型的属性都比较简单:每个属性项只要分别给出属性名和属性值就足够了。

    当使用<map>元素配置Map类型属性时稍显复杂,因为Map类型的元素由多个<entry>组成,每个<entry>又需要配置key和value两个属性。其中<entry>属性支持以下几个属性:

  • key:当key是基本类型或字符串时使用

  • key-ref:当key类型是容器中定义的另一个Bean时使用

  • value:当value是基本类型或字符串时使用

  • value-ref:当value是容器中定义的另一个Bean时使用

    Spring还提供了一个简化语法来支持Properties形参的setter方法,例如我们可以使用如下配置片段来配置Properties类型的属性:

?
1
2
3
4
5
6
< property  name = "propertiesTest" >
     < value >
         key1=value1
         key2=value2
     </ value >
</ property >

    虽然这种配置方式更简单,但是它也有一个缺点:属性名、属性值都只能是英文或数字,不能包含中文字符

    从Spring2开始,Spring IoC容器支持集合的合并:子Bean中的集合属性可以从其父Bean的集合属性继承而来,同时,子Bean中的属性会覆盖父Bean中属性名相同的值。也就是说,子Bean的集合属性的最终值是父Bean、子Bean合并后的最终结果,下面是一个示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 将parent类型定义成抽象类 -->
< bean  id = "parent"  abstract = "true"  class = "com.abc.Parent" >
     <!-- 定义Properties类型的集合属性 -->
     < property  name = "websites" >
         < props >
             < prop  key = "baidu" >www.baidu.com</ props >
             < prop  key = "google" >www.google.com.hk</ prop >
         < props >
     </ property >
</ bean >
< bean  id = "child"  parent = "parent" >
     < property  name = "websites" >
         <!-- 注意,这里子Bean在集合元素上加了属性"merge=true" -->
         < props  merge = "true" >
             < prop  key = "google" >www.google.com</ prop >
             < prop  key = "tencent" >www.qq.com</ prop >
         < props >
     </ property >    
</ bean >

    通过上面的配置后,child中的属性将变为:

?
1
2
3
baidu=www.baidu.com
google=www.google.com
tencent=www.qq.com

    


目录
相关文章
|
17天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
25天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
126 1
|
29天前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
9天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
86 62
|
7天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
7天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
20 2
|
21天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
26天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
38 3
|
27天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
34 2