Spring - Menyuntikkan Koleksi

1. Perkenalan

Dalam tutorial ini, kami akan menunjukkan cara menyuntikkan koleksi Java menggunakan kerangka Spring .

Sederhananya, kami akan mendemonstrasikan contoh dengan antarmuka Koleksi , Peta, Set .

2. Daftar Dengan @Autowired

Mari buat contoh kacang:

public class CollectionsBean { @Autowired private List nameList; public void printNameList() { System.out.println(nameList); } }

Di sini, kita menyatakan namelist properti untuk mengadakan Daftar dari String nilai.

Dalam contoh ini, kami menggunakan injeksi bidang untuk nameList . Oleh karena itu, kami menempatkan anotasi @Autowired .

Untuk mempelajari lebih lanjut tentang injeksi ketergantungan atau berbagai cara untuk mengimplementasikannya, lihat panduan ini.

Setelah itu, kami mendaftarkan CollectionsBean di kelas konfigurasi konfigurasi:

@Configuration public class CollectionConfig { @Bean public CollectionsBean getCollectionsBean() { return new CollectionsBean(); } @Bean public List nameList() { return Arrays.asList("John", "Adam", "Harry"); } }

Selain mendaftarkan CollectionsBean , kami juga memasukkan daftar baru dengan menginisialisasi dan mengembalikannya secara eksplisit sebagai konfigurasi @Bean terpisah .

Sekarang, kita bisa menguji hasilnya:

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean( CollectionsBean.class); collectionsBean.printNameList();

Output dari metode printNameList ():

[John, Adam, Harry]

3. Diatur Dengan Injeksi Konstruktor

Untuk menyiapkan contoh yang sama dengan koleksi Set , mari kita ubah kelas CollectionsBean :

public class CollectionsBean { private Set nameSet; public CollectionsBean(Set strings) { this.nameSet = strings; } public void printNameSet() { System.out.println(nameSet); } }

Kali ini kami ingin menggunakan injeksi konstruktor untuk menginisialisasi properti nameSet . Ini membutuhkan juga perubahan dalam kelas konfigurasi:

@Bean public CollectionsBean getCollectionsBean() { return new CollectionsBean(new HashSet(Arrays.asList("John", "Adam", "Harry"))); }

4. Peta Dengan Injeksi Setter

Mengikuti logika yang sama, mari tambahkan bidang nameMap untuk mendemonstrasikan injeksi peta:

public class CollectionsBean { private Map nameMap; @Autowired public void setNameMap(Map nameMap) { this.nameMap = nameMap; } public void printNameMap() { System.out.println(nameMap); } }

Kali ini kami memiliki metode penyetel untuk menggunakan injeksi ketergantungan penyetel . Kita juga perlu menambahkan kode inisialisasi Map di kelas konfigurasi:

@Bean public Map nameMap(){ Map nameMap = new HashMap(); nameMap.put(1, "John"); nameMap.put(2, "Adam"); nameMap.put(3, "Harry"); return nameMap; }

Hasil setelah menjalankan metode printNameMap () :

{1=John, 2=Adam, 3=Harry}

5. Memasukkan Referensi Bean

Mari kita lihat contoh di mana kita memasukkan referensi kacang sebagai elemen koleksi.

Pertama, mari buat kacang:

public class BaeldungBean { private String name; // constructor }

Dan menambahkan Daftar dari BaeldungBean sebagai properti untuk CollectionsBean kelas:

public class CollectionsBean { @Autowired(required = false) private List beanList; public void printBeanList() { System.out.println(beanList); } }

Selanjutnya, kami menambahkan metode pabrik konfigurasi Java untuk setiap elemen BaeldungBean :

@Configuration public class CollectionConfig { @Bean public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } // other factory methods }

Wadah Musim Semi menyuntikkan biji individu dari jenis BaeldungBean ke dalam satu koleksi.

Untuk mengujinya, kita memanggil metode collectionsBean.printBeanList () . Outputnya menunjukkan nama kacang sebagai elemen daftar:

[John, Harry, Adam]

Sekarang, mari kita pertimbangkan skenario ketika tidak ada BaeldungBean . Jika tidak ada BaeldungBean yang terdaftar dalam konteks aplikasi, Spring akan mengeluarkan pengecualian karena dependensi yang diperlukan tidak ada.

Kita bisa menggunakan @Autowired (required = false) untuk menandai ketergantungan sebagai opsional. Alih-alih membuat pengecualian, beanList tidak akan diinisialisasi dan nilainya akan tetap null .

Jika kita membutuhkan list kosong dan bukan null, kita bisa menginisialisasi beanList dengan ArrayList baru :

@Autowired(required = false) private List beanList = new ArrayList();

5.1. Menggunakan @Order untuk Menyortir Kacang

Kita bisa menentukan urutan biji sambil menyuntikkan ke dalam koleksi .

Untuk tujuan itu, kami menggunakan anotasi @Order dan menentukan indeksnya:

@Configuration public class CollectionConfig { @Bean @Order(2) public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean @Order(3) public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean @Order(1) public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } }

Wadah pegas pertama akan menyuntikkan biji dengan nama “Harry” , karena memiliki nilai pesanan paling rendah.

It will then inject the “John”, and finally, the “Adam” bean:

[Harry, John, Adam]

Learn more about @Order in this guide.

5.2. Using @Qualifier to Select Beans

We can use the @Qualifier to select the beans to be injected into the specific collection that matches the @Qualifier name.

Here's how we use it for the injection point:

@Autowired @Qualifier("CollectionsBean") private List beanList;

Then, we mark with the same @Qualifier the beans that we want to inject into the List:

@Configuration public class CollectionConfig { @Bean @Qualifier("CollectionsBean") public BaeldungBean getElement() { return new BaeldungBean("John"); } @Bean public BaeldungBean getAnotherElement() { return new BaeldungBean("Adam"); } @Bean public BaeldungBean getOneMoreElement() { return new BaeldungBean("Harry"); } // other factory methods }

In this example, we specify that the bean with the name “John” will be injected into the List named “CollectionsBean”. The results we test here:

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class); CollectionsBean collectionsBean = context.getBean(CollectionsBean.class); collectionsBean.printBeanList();

Dari keluaran, kita melihat bahwa koleksi kita hanya memiliki satu elemen:

[John]

6. Menyetel Daftar Kosong sebagai Nilai Default

Kita bisa menyetel nilai default untuk properti List yang diinjeksi sebagai daftar kosong dengan menggunakan metode statis Collections.emptyList () :

public class CollectionsBean { @Value("${names.list:}#{T(java.util.Collections).emptyList()}") private List nameListWithDefaultValue; public void printNameListWithDefaults() { System.out.println(nameListWithDefaultValue); } }

Jika kita menjalankan ini dengan kunci "names.list" yang tidak diinisialisasi melalui file properti:

collectionsBean.printNameListWithDefaults();

Kami akan mendapatkan daftar kosong sebagai output:

[ ]

7. Ringkasan

Dengan panduan ini, kami belajar cara memasukkan berbagai jenis koleksi Java menggunakan framework Spring.

Kami juga memeriksa injeksi dengan jenis referensi dan cara memilih atau memesannya di dalam koleksi.

Seperti biasa, kode lengkap tersedia di proyek GitHub.