在Spring-Boot中如何使用@Value注解注入集合類
我們?cè)谑褂胹pring框架進(jìn)行開發(fā)時(shí),有時(shí)候需要在properties文件中配置集合內(nèi)容并注入到代碼中使用。本篇文章的目的就是給出一種可行的方式。
1.注入通常來(lái)說(shuō),我們都使用@Value注解來(lái)注入properties文件中的內(nèi)容,注入集合類時(shí),我們也使用@Value來(lái)注入。
properties文件中的內(nèi)容如下:my.set=foo,barmy.list=foo,barmy.map={'foo': 'bar'}
分別是我們要注入的Set,List,Map中的內(nèi)容。
注入方式如下:@Value('#{${my.map}}')private Map<String, String> map;@Value('#{’${my.set}’}')private Set<String> set;@Value('#{’${my.list}’}')private List<String> list;2.驗(yàn)證
我們寫一個(gè)單測(cè)類來(lái)驗(yàn)證上面的注入是否可行。
@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中的內(nèi)容已經(jīng)在上面給出,位置在test文件夾下的resources文件夾下面(maven項(xiàng)目的文件夾結(jié)構(gòu))。
3.原理在我們使用的@Value注解中,每一個(gè)開頭都有個(gè)#,這其實(shí)就是說(shuō)明我們使用了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);我們也使用單元測(cè)試來(lái)驗(yàn)證:
@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方法的代碼已經(jīng)在驗(yàn)證使用@Value注解方式的單元測(cè)試中給出。
4.總結(jié)我們用@Value注解把properties文件中的內(nèi)容注入了集合類,注解中以#開頭,其實(shí)就是使用了SpEL。
Spring-Boot的版本是2.2.1.RELEASE,之所以要說(shuō)這個(gè),是因?yàn)橐婚_始使用1.x版本時(shí)無(wú)法注入Set和List。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. vue 項(xiàng)目@change多個(gè)參數(shù)傳值多個(gè)事件的操作2. vue使用webSocket更新實(shí)時(shí)天氣的方法3. vue+element+oss實(shí)現(xiàn)前端分片上傳和斷點(diǎn)續(xù)傳4. Android在自定義類中實(shí)現(xiàn)自定義監(jiān)聽器方式5. Vue 路由返回恢復(fù)頁(yè)面狀態(tài)的操作方法6. 探究Android客戶端網(wǎng)絡(luò)預(yù)連接優(yōu)化機(jī)制7. android RecycleView實(shí)現(xiàn)多級(jí)樹形列表8. Android Studio 2.0 功能介紹9. Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器APP10. 基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳插件功能
