在Spring-Boot中如何使用@Value注解注入集合类

 更新时间:2021年08月02日 11:56:13   作者:m0_38063172  
这篇文章主要介绍了在Spring-Boot中如何使用@Value注解注入集合类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

我们在使用spring框架进行开发时,有时候需要在properties文件中配置集合内容并注入到代码中使用。本篇文章的目的就是给出一种可行的方式。

1.注入

通常来说,我们都使用@Value注解来注入properties文件中的内容,注入集合类时,我们也使用@Value来注入。

properties文件中的内容如下:

my.set=foo,bar
my.list=foo,bar
my.map={"foo": "bar"}

分别是我们要注入的Set,List,Map中的内容。

注入方式如下:

@Value("#{${my.map}}")
private Map<String, String> map;
@Value("#{'${my.set}'}")
private Set<String> set;
@Value("#{'${my.list}'}")
private List<String> list;

2.验证

我们写一个单测类来验证上面的注入是否可行。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
        classes = PropertiesTest.ClassUsingProperties.class)
@TestPropertySource(locations = "classpath:test.properties")
public class PropertiesTest {

    @Autowired
    private ClassUsingProperties classUsingProperties;

    @Test
    public void testInjectCollectionFieldsUsingPropertiesFile() {
        Map<String, String> map = classUsingProperties.getMap();
        Set<String> set = classUsingProperties.getSet();
        List<String> list = classUsingProperties.getList();
        asserts(map, set, list);
    }

    private void asserts(Map<String, String> map, Set<String> set, List<String> list) {
        Assert.assertEquals(map.get("foo"), "bar");
        Assert.assertTrue(set.contains("foo"));
        Assert.assertTrue(set.contains("bar"));
        Assert.assertTrue(list.contains("foo"));
        Assert.assertTrue(list.contains("bar"));
    }

    @Data
    @Component
    public static class ClassUsingProperties {
        @Value("#{${my.map}}")
        private Map<String, String> map;
        @Value("#{'${my.set}'}")
        private Set<String> set;
        @Value("#{'${my.list}'}")
        private List<String> list;
    }
}

test.properties中的内容已经在上面给出,位置在test文件夹下的resources文件夹下面(maven项目的文件夹结构)。

3.原理

在我们使用的@Value注解中,每一个开头都有个#,这其实就是说明我们使用了SpEL,如果直接使用SpEL,

就是下面的代码:

ExpressionParser parser = new SpelExpressionParser();
Map<String, String> map =
                (Map<String, String>) parser
                      .parseExpression({'foo':'bar'}")
                      .getValue(Map.class);
Set<String> set =
                (Set<String>) parser
                        .parseExpression("'foo,bar'")
                        .getValue(Set.class);
List<String> list =
                (List<String>) parser
                        .parseExpression("'foo,bar'")
                        .getValue(List.class);

我们也使用单元测试来验证:

@Test
@SuppressWarnings("unchecked")
public void testInitCollectionUsingSpEL() {
    ExpressionParser parser = new SpelExpressionParser();
    Map<String, String> map =
            (Map<String, String>) parser
                    .parseExpression("{'foo':'bar'}")
                    .getValue(Map.class);
    Set<String> set =
            (Set<String>) parser
                    .parseExpression("'foo,bar'")
                    .getValue(Set.class);
    List<String> list =
            (List<String>) parser
                    .parseExpression("'foo,bar'")
                    .getValue(List.class);
    asserts(map, set, list);
}

asserts方法的代码已经在验证使用@Value注解方式的单元测试中给出。

4.总结

我们用@Value注解把properties文件中的内容注入了集合类,注解中以#开头,其实就是使用了SpEL。

Spring-Boot的版本是2.2.1.RELEASE,之所以要说这个,是因为一开始使用1.x版本时无法注入Set和List。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 策略模式:告别if else

    策略模式:告别if else

    你是不是还在写着大量的if else语句,if else 不仅难以维护不易扩展,而且使代码臃肿不堪,想不想让你的业务代码更加的健壮,更易扩展,那你一定要学一学今天的主角策略模式
    2021-06-06
  • Java学习之缓冲流的原理详解

    Java学习之缓冲流的原理详解

    为了提高其数据的读写效率,Java中又定义了四种缓冲流,分别是:字节缓冲输入流、字节缓冲输出流、字符缓冲输入流和字符缓冲输出流。本文主要来和大家聊聊这些缓冲流的原理,希望对大家有所帮助
    2023-01-01
  • 关于ireport中传入list的处理方式

    关于ireport中传入list的处理方式

    这篇文章主要介绍了关于ireport中传入list的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 微信小程序录音文件格式silk遇到的问题及解决方法

    微信小程序录音文件格式silk遇到的问题及解决方法

    录音文件为silk格式,说是silk其实是base64加密后的webm格式,只需将其转为webm格式即可。但是在处理过程中遇到各种坑,下面小编给大家带来了微信小程序录音文件格式silk遇到的问题及解决方法,感兴趣的朋友一起看看吧
    2018-09-09
  • Java的微信开发中使用XML格式和JSON格式数据的示例

    Java的微信开发中使用XML格式和JSON格式数据的示例

    这篇文章主要介绍了Java微信开发中使用XML格式和JSON格式数据的示例,注意一下json-lib所需要的jar包,需要的朋友可以参考下
    2016-02-02
  • 从0开始学习大数据之java spark编程入门与项目实践

    从0开始学习大数据之java spark编程入门与项目实践

    这篇文章主要介绍了从0开始学习大数据之java spark编程入门与项目实践,结合具体入门项目分析了大数据java spark编程项目建立、调试、输出等相关步骤及操作技巧,需要的朋友可以参考下
    2019-11-11
  • Java中args参数数组的用法说明

    Java中args参数数组的用法说明

    这篇文章主要介绍了Java中args参数数组的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java并发编程StampedLock高性能读写锁详解

    java并发编程StampedLock高性能读写锁详解

    这篇文章主要为大家介绍了java并发编程StampedLock高性能读写锁的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 移除元素Java实现方式

    移除元素Java实现方式

    这篇文章主要介绍了移除元素Java实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • icePDF去水印的方法(推荐)

    icePDF去水印的方法(推荐)

    下面小编就为大家带来一篇icePDF去水印的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论