@Value竟然能玩出这么多花样 (3)

有了基本类型和数组,的确让我们更加方便了。但对数据的处理,只用数组这一种数据结构是远远不够的,下面给大家介绍一下其他的常用数据结构。

6.3.1 List

List是数组的变种,它的长度是可变的,而数组的长度是固定的。

我们看看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

当你满怀希望的启动项目,准备使用这个功能的时候,却发现竟然报错了。

@Value竟然能玩出这么多花样


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 Set

Set也是一种保存数据的集合,它比较特殊,里面保存的数据不会重复。

我们可以这样定义Set:

@Value("#{'${susan.test.set}'.split(',')}") private Set<String> set;

配置文件是这样的:

susan.test.set=10,11,12,13

Set跟List的用法极为相似。

但为了证明本节的独特之处,我打算说点新鲜的内容。

如何给List或者Set设置默认值空呢?

有些朋友可能会说:这还不简单,直接在@Value的$表达式后面加个:号不就行了。

具体代码如下:

@Value("#{'${susan.test.set:}'.split(',')}") private Set<String> set;

结果却跟想象中不太一样:

@Value竟然能玩出这么多花样


Set集合怎么不是空的,而是包含了一个空字符串的集合?

好吧,那我在:号后加null,总可以了吧?

@Value竟然能玩出这么多花样


Set集合也不是空的,而是包含了一个"null"字符串的集合。

这也不行,那也不行,该如何是好?

答:使用EL表达式的empty方法。

具体代码如下:

@Value("#{'${susan.test.set:}'.empty ? null : '${susan.test.set:}'.split(',')}") private Set<String> set;

运行之后,结果对了:

@Value竟然能玩出这么多花样

其实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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgxwy.html