Suntikan Susunan dan Daftar Dari Fail Properties Musim Semi

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan belajar bagaimana memasukkan nilai ke dalam array atau Daftar dari fail sifat Spring.

2. Kelakuan Lalai

Kita akan mulakan dengan fail aplikasi.properties yang mudah :

arrayOfStrings=Baeldung,dot,com

Mari kita lihat bagaimana Spring berkelakuan ketika kita menetapkan jenis pemboleh ubah kita ke String [] :

@Value("${arrayOfStrings}") private String[] arrayOfStrings;
@Test void whenContextIsInitialized_thenInjectedArrayContainsExpectedValues() { assertEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); }

Kita dapat melihat bahawa Spring dengan betul menganggap pembatas kita adalah koma dan memulakan susunan dengan sewajarnya.

Kita juga harus perhatikan bahawa, secara lalai, menyuntikkan array berfungsi dengan betul hanya apabila kita mempunyai nilai yang dipisahkan koma.

3. Menyenaraikan Senarai

Sekiranya kita cuba memasukkan Senarai dengan cara yang sama, kita akan mendapat hasil yang mengejutkan:

@Value("${arrayOfStrings}") private List unexpectedListOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() { assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings); }

Senarai kami mengandungi satu elemen, yang sama dengan nilai yang kami tetapkan dalam fail sifat kami.

Untuk memasukkan Senarai dengan betul , kita perlu menggunakan sintaks khas yang disebut Spring Expression Language (SpEL):

@Value("#{'${arrayOfStrings}'.split(',')}") private List listOfStrings;
@Test void whenContextIsInitialized_thenInjectedListContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }

Kita dapat melihat bahawa ungkapan kita bermula dengan # dan bukannya $ yang kita biasa dengan @Value .

Kita juga harus perhatikan bahawa kita menggunakan kaedah perpecahan , yang menjadikan ungkapan sedikit lebih rumit daripada suntikan biasa.

Sekiranya kami ingin membuat ungkapan kami sedikit lebih sederhana, kami dapat menyatakan harta kami dalam format khas:

listOfStrings={'Baeldung','dot','com'}

Spring akan mengenali format ini, dan kami dapat memasukkan Senarai kami dengan menggunakan ungkapan yang lebih sederhana:

@Value("#{${listOfStrings}}") private List listOfStringsV2;
@Test void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2); }

4. Menggunakan Pembatas Khusus

Mari buat harta yang serupa, tetapi kali ini, kita akan menggunakan pembatas yang berbeza:

listOfStringsWithCustomDelimiter=Baeldung;dot;com

Seperti yang kita lihat apabila menyuntik Senarai , kita boleh menggunakan ungkapan khas di mana kita boleh menentukan pembatas yang diingini:

@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}") private List listOfStringsWithCustomDelimiter;
@Test void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() { assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter); }

5. Menyuntik Jenis Lain

Mari lihat sifat berikut:

listOfBooleans=false,false,true listOfIntegers=1,2,3,4 listOfCharacters=a,b,c

Kami dapat melihat bahawa Spring menyokong jenis asas di luar kotak, jadi kami tidak perlu melakukan penghuraian khas:

@Value("#{'${listOfBooleans}'.split(',')}") private List listOfBooleans; @Value("#{'${listOfIntegers}'.split(',')}") private List listOfIntegers; @Value("#{'${listOfCharacters}'.split(',')}") private List listOfCharacters;
@Test void whenContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues() { assertEquals(Arrays.asList(false, false, true), listOfBooleans); assertEquals(Arrays.asList(1, 2, 3, 4), listOfIntegers); assertEquals(Arrays.asList('a', 'b', 'c'), listOfCharacters); }

Ini hanya disokong melalui SpEL, jadi kami tidak dapat menyuntikkan array dengan cara yang sama.

6. Sifat Membaca Secara Berprogram

Untuk membaca harta tanah secara terprogram, pertama-tama kita perlu mendapatkan contoh objek Lingkungan kita :

@Autowired private Environment environment;

Kemudian, kita hanya boleh menggunakan kaedah getProperty untuk membaca mana-mana harta tanah dengan menentukan kunci dan jenis yang diharapkan:

@Test void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() { String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class); List listOfStrings = (List)environment.getProperty("arrayOfStrings", List.class); assertEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings); assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings); }

7. Kesimpulannya

Dalam tutorial ringkas ini, kami telah belajar bagaimana menyuntikkan susunan dan Daftar dengan mudah melalui contoh cepat dan praktikal.

Seperti biasa, kodnya tersedia di GitHub.