Panduan Cepat untuk Spring @Value

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat anotasi @Value Spring.

Anotasi ini dapat digunakan untuk memasukkan nilai ke dalam bidang dalam kacang yang dikelola Musim semi, dan dapat diterapkan pada bidang atau tingkat parameter konstruktor / metode.

2. Menyiapkan Aplikasi

Untuk menjelaskan berbagai jenis penggunaan anotasi ini, kita perlu mengkonfigurasi kelas konfigurasi aplikasi Spring sederhana.

Biasanya, kita memerlukan file properti untuk menentukan nilai yang ingin kita masukkan dengan anotasi @Value . Jadi, pertama-tama kita perlu mendefinisikan @PropertySource di kelas konfigurasi kita - dengan nama file properti.

Mari tentukan file properti:

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

3. Contoh Penggunaan

Sebagai contoh dasar dan sebagian besar tidak berguna, kami hanya dapat memasukkan "nilai string" dari anotasi ke bidang:

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

Menggunakan anotasi @PropertySource memungkinkan kita untuk bekerja dengan nilai dari file properti dengan anotasi @Value .

Dalam contoh berikut, kami mendapatkan Nilai yang didapat dari file yang ditugaskan ke bidang:

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

Kami juga dapat mengatur nilai dari properti sistem dengan sintaks yang sama.

Mari kita asumsikan bahwa kita telah mendefinisikan properti sistem bernama systemValue :

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

Nilai default dapat diberikan untuk properti yang mungkin tidak ditentukan. Di sini, nilai beberapa default akan dimasukkan:

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

Jika properti yang sama didefinisikan sebagai properti sistem dan dalam file properti, maka properti sistem akan diterapkan.

Misalkan kita memiliki prioritas properti yang didefinisikan sebagai properti sistem dengan nilai properti Sistem dan didefinisikan sebagai sesuatu yang lain di file properti. Nilainya akan menjadi properti Sistem :

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

Terkadang, kita perlu memasukkan banyak nilai. Akan lebih mudah untuk mendefinisikannya sebagai nilai yang dipisahkan koma untuk satu properti dalam file properti atau sebagai properti sistem dan untuk dimasukkan ke dalam array.

Di bagian pertama, kita mendefinisikan nilai yang dipisahkan koma di listOfValues dari file properti , sehingga nilai lariknya adalah [“A”, “B”, “C”]:

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

4. Contoh Tingkat Lanjut Dengan SpEL

Kita juga bisa menggunakan ekspresi SpEL untuk mendapatkan nilainya.

Jika kita memiliki properti sistem bernama prioritas, maka nilainya akan diterapkan ke bidang:

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

Jika kita belum mendefinisikan properti sistem, maka nilai null akan diberikan.

Untuk mencegah hal ini, kami dapat memberikan nilai default pada ekspresi SpEL. Kami mendapatkan beberapa nilai default untuk bidang jika properti sistem tidak ditentukan:

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

Selanjutnya, kita dapat menggunakan nilai bidang dari biji lainnya. Misalkan kita memiliki kacang bernama someBean dengan field someValue sama dengan 10 . Kemudian, 10 akan ditugaskan ke lapangan:

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

Kita dapat memanipulasi properti untuk mendapatkan Daftar nilai, di sini, daftar nilai string A, B, dan C:

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

5. Menggunakan @Value With Maps

Kita juga bisa menggunakan anotasi @Value untuk memasukkan properti Map .

Pertama, kita perlu mendefinisikan properti dalam bentuk {key: 'value'} di file properti kita:

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

Perhatikan bahwa nilai di Peta harus dalam tanda kutip tunggal.

Sekarang kita dapat memasukkan nilai ini dari file properti sebagai Peta :

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

Jika kita perlu mendapatkan nilai kunci tertentu di Peta , yang harus kita lakukan adalah menambahkan nama kunci dalam ekspresi :

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

Jika kita tidak yakin apakah Map berisi kunci tertentu, kita harus memilih ekspresi yang lebih aman yang tidak akan memunculkan pengecualian tetapi menyetel nilainya ke null ketika kuncinya tidak ditemukan:

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

Kami juga dapat menetapkan nilai default untuk properti 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 dapat disaring sebelum injeksi.

Mari kita asumsikan kita hanya perlu mendapatkan entri yang nilainya lebih besar dari satu:

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

Kita juga dapat menggunakan anotasi @Value untuk memasukkan semua properti sistem saat ini :

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

6. Menggunakan @Value Dengan Injeksi Konstruktor

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 memeriksa berbagai kemungkinan menggunakan anotasi @Value dengan properti sederhana yang ditentukan dalam file, dengan properti sistem, dan properti yang dihitung dengan ekspresi SpEL.

Seperti biasa, aplikasi contoh tersedia di proyek GitHub.