Panduan Pantas untuk Spring @Value

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat penjelasan @Value Spring.

Anotasi ini dapat digunakan untuk menyuntikkan nilai ke ladang dalam kacang yang dikendalikan musim bunga, dan dapat diterapkan pada tingkat parameter ladang atau konstruktor / kaedah.

2. Menyiapkan Aplikasi

Untuk menerangkan pelbagai jenis penggunaan untuk anotasi ini, kita perlu mengkonfigurasi kelas konfigurasi aplikasi Spring yang sederhana.

Secara semula jadi, kita memerlukan fail sifat untuk menentukan nilai yang ingin kita suntikan dengan anotasi @Value . Oleh itu, pertama kita perlu menentukan @PropertySource di kelas konfigurasi kita - dengan nama fail sifat.

Mari tentukan fail sifat:

value.from.file=Value got from the file priority=high listOfValues=A,B,C

3. Contoh Penggunaan

Sebagai contoh asas dan tidak berguna, kita hanya dapat menyuntikkan "nilai rentetan" dari anotasi ke medan:

@Value("string value") private String stringValue;

Menggunakan anotasi @PropertySource membolehkan kita bekerja dengan nilai dari fail sifat dengan anotasi @Value .

Dalam contoh berikut, kita mendapat Nilai yang diperoleh dari fail yang ditugaskan ke bidang:

@Value("${value.from.file}") private String valueFromFile;

Kita juga dapat menetapkan nilai dari sifat sistem dengan sintaks yang sama.

Mari kita anggap bahawa kita telah menentukan sifat sistem bernama systemValue :

@Value("${systemValue}") private String systemValue;

Nilai lalai dapat diberikan untuk sifat yang mungkin tidak ditentukan. Di sini, nilai beberapa lalai akan disuntik:

@Value("${unknown.param:some default}") private String someDefault;

Sekiranya sifat yang sama didefinisikan sebagai sifat sistem dan dalam fail sifat, maka sifat sistem akan diterapkan.

Anggaplah kita mempunyai keutamaan harta yang ditakrifkan sebagai sifat sistem dengan nilai sifat Sistem dan ditakrifkan sebagai sesuatu yang lain dalam fail sifat. Nilainya adalah sifat Sistem :

@Value("${priority}") private String prioritySystemProperty;

Kadang kala, kita perlu menyuntik banyak nilai. Adalah lebih baik untuk mendefinisikannya sebagai nilai yang dipisahkan koma untuk sifat tunggal dalam fail sifat atau sebagai sifat sistem dan menyuntikkan ke dalam array.

Pada bahagian pertama, kami menentukan nilai yang dipisahkan koma dalam listOfValues dari fail sifat , jadi nilai array akan menjadi ["A", "B", "C"]:

@Value("${listOfValues}") private String[] valuesArray;

4. Contoh Lanjutan Dengan SpEL

Kita juga boleh menggunakan ungkapan SpEL untuk mendapatkan nilainya.

Sekiranya kita mempunyai sifat sistem yang diberi keutamaan, maka nilainya akan diterapkan ke bidang:

@Value("#{systemProperties['priority']}") private String spelValue;

Sekiranya kita belum menentukan sifat sistem, maka nilai nol akan diberikan.

Untuk mengelakkan ini, kami dapat memberikan nilai lalai dalam ungkapan SpEL. Kami mendapat beberapa nilai lalai untuk bidang jika sifat sistem tidak ditentukan:

@Value("#{systemProperties['unknown'] ?: 'some default'}") private String spelSomeDefault;

Selanjutnya, kita dapat menggunakan nilai ladang dari kacang lain. Katakan kita mempunyai kacang bernama someBean dengan medan someValue sama dengan 10 . Kemudian, 10 akan ditugaskan ke lapangan:

@Value("#{someBean.someValue}") private Integer someBeanValue;

Kita boleh memanipulasi sifat untuk mendapatkan Senarai nilai, di sini, senarai nilai rentetan A, B, dan C:

@Value("#{'${listOfValues}'.split(',')}") private List valuesList;

5. Menggunakan @Value With Maps

Kami juga boleh menggunakan anotasi @Value untuk menyuntik harta Peta .

Pertama, kita perlu menentukan sifat dalam borang {key: 'value'} dalam fail sifat kita:

valuesMap={key1: '1', key2: '2', key3: '3'}

Perhatikan bahawa nilai dalam Peta mestilah dalam tanda petik tunggal.

Sekarang kita dapat memasukkan nilai ini dari fail harta tanah sebagai Peta :

@Value("#{${valuesMap}}") private Map valuesMap;

Sekiranya kita perlu mendapatkan nilai kunci tertentu dalam Peta , yang harus kita lakukan adalah menambahkan nama kunci dalam ungkapan :

@Value("#{${valuesMap}.key1}") private Integer valuesMapKey1;

Sekiranya kami tidak pasti sama ada Peta mengandungi kunci tertentu, kami harus memilih ungkapan yang lebih selamat yang tidak akan memberikan pengecualian tetapi menetapkan nilai menjadi nol apabila kunci tidak dijumpai:

@Value("#{${valuesMap}['unknownKey']}") private Integer unknownMapKey;

Kami juga dapat menetapkan nilai lalai untuk sifat atau kunci yang mungkin tidak ada :

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}") private Map unknownMap; @Value("#{${valuesMap}['unknownKey'] ?: 5}") private Integer unknownMapKeyWithDefaultValue;

Entri peta juga boleh disaring sebelum disuntik.

Anggaplah kita hanya perlu mendapatkan entri yang nilainya lebih besar daripada satu:

@Value("#{${valuesMap}.?[value>'1']}") private Map valuesMapFiltered;

Kami juga boleh menggunakan anotasi @Value untuk memasukkan semua sifat sistem semasa :

@Value("#{systemProperties}") private Map systemPropertiesMap;

6. Menggunakan @Value With Constructor Injection

When we use the @Value annotation, we're not limited to a field injection. We can also use it together with constructor injection.

Let's see this in practice:

@Component @PropertySource("classpath:values.properties") public class PriorityProvider { private String priority; @Autowired public PriorityProvider(@Value("${priority:normal}") String priority) { this.priority = priority; } // standard getter }

In the above example, we inject a priority directly into our PriorityProvider‘s constructor.

Note that we also provide a default value in case the property isn't found.

7. Using @Value With Setter Injection

Analogous to the constructor injection, we can also use @Value with setter injection.

Let's take a look:

@Component @PropertySource("classpath:values.properties") public class CollectionProvider { private List values = new ArrayList(); @Autowired public void setValues(@Value("#{'${listOfValues}'.split(',')}") List values) { this.values.addAll(values); } // standard getter }

We use the SpEL expression to inject a list of values into the setValues method.

8. Conclusion

Dalam artikel ini, kami meneliti berbagai kemungkinan menggunakan anotasi @Value dengan sifat sederhana yang ditentukan dalam fail, dengan sifat sistem, dan dengan sifat yang dihitung dengan ungkapan SpEL.

Seperti biasa, aplikasi contoh boleh didapati di projek GitHub.