有了基本类型和数组,的确让我们更加方便了。但对数据的处理,只用数组这一种数据结构是远远不够的,下面给大家介绍一下其他的常用数据结构。
6.3.1 ListList是数组的变种,它的长度是可变的,而数组的长度是固定的。
我们看看List是如何注入属性值的:
@Value("${susan.test.list}") private List<String> list;最关键的是看配置文件:
susan.test.list[0]=10 susan.test.list[1]=11 susan.test.list[2]=12 susan.test.list[3]=13当你满怀希望的启动项目,准备使用这个功能的时候,却发现竟然报错了。
what?
看来@Value不支持这种直接的List注入。
那么,如何解决这个问题呢?
有人说用@ConfigurationProperties。
需要定义一个MyConfig类:
@Configuration @ConfigurationProperties(prefix = "susan.test") @Data public class MyConfig { private List<String> list; }然后在调用的地方这样写:
@Service public class UserService { @Autowired private MyConfig myConfig; public String test() { System.out.println(myConfig.getList()); return null; } }这种方法确实能够完成List注入。但是,只能说明@ConfigurationProperties注解的强大,跟@Value有半毛钱的关系?
答:没有。
那么,问题来了,用@Value如何实现这个功能呢?
答:使用spring的EL表达式。
List的定义改成:
@Value("#{'${susan.test.list}'.split(',')}") private List<String> list;使用#号加大括号的EL表达式。
然后配置文件改成:
susan.test.list=10,11,12,13跟定义数组时的配置文件一样。
6.3.2 SetSet也是一种保存数据的集合,它比较特殊,里面保存的数据不会重复。
我们可以这样定义Set:
@Value("#{'${susan.test.set}'.split(',')}") private Set<String> set;配置文件是这样的:
susan.test.set=10,11,12,13Set跟List的用法极为相似。
但为了证明本节的独特之处,我打算说点新鲜的内容。
如何给List或者Set设置默认值空呢?
有些朋友可能会说:这还不简单,直接在@Value的$表达式后面加个:号不就行了。
具体代码如下:
@Value("#{'${susan.test.set:}'.split(',')}") private Set<String> set;结果却跟想象中不太一样:
Set集合怎么不是空的,而是包含了一个空字符串的集合?
好吧,那我在:号后加null,总可以了吧?
Set集合也不是空的,而是包含了一个"null"字符串的集合。
这也不行,那也不行,该如何是好?
答:使用EL表达式的empty方法。
具体代码如下:
@Value("#{'${susan.test.set:}'.empty ? null : '${susan.test.set:}'.split(',')}") private Set<String> set;运行之后,结果对了:
其实List也有类似的问题,也能使用该方法解决问题。
在这里温馨的提醒一下,该判断的表达式比较复杂,自己手写非常容易写错,建议复制粘贴之后根据实际需求改改。
6.3.3 Map还有一种比较常用的集合是map,它支持key/value键值对的形式保存数据,并且不会出现相同key的数据。
我们可以这样定义Map:
@Value("#{${susan.test.map}}") private Map<String, String> map;配置文件是这样的:
susan.test.map={"name":"苏三", "age":"18"}这种用法跟上面稍微有一点区别。
设置默认值的代码如下:
@Value("#{'${susan.test.map:}'.empty ? null : '${susan.test.map:}'}") private Map<String, String> map; 7 EL高端玩法前面我们已经见识过spring EL表达式的用法了,在设置空的默认值时特别有用。
其实,empty方法只是它很普通的用法,还有更高端的用法,不信我们一起看看。
7.1 注入bean