Spring - Koleksi Suntikan

1. Pengenalan

Dalam tutorial ini, kita akan menunjukkan cara menyuntik koleksi Java menggunakan rangka Spring .

Ringkasnya, kami akan menunjukkan contoh dengan antara muka koleksi List, Map, Set .

2. Senaraikan Dengan @Autowired

Mari buat contoh kacang:

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

Di sini, kami mengisytiharkan nameList harta untuk mengadakan Senarai daripada String nilai.

Dalam contoh ini, kami menggunakan suntikan medan untuk nameList . Oleh itu, kami meletakkan anotasi @Autowired .

Untuk mengetahui lebih lanjut mengenai suntikan kebergantungan atau cara yang berbeza untuk melaksanakannya, lihat panduan ini.

Selepas 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 menyuntikkan senarai baru dengan secara eksplisit menginisialisasi dan mengembalikannya sebagai konfigurasi @Bean yang terpisah .

Sekarang, kita dapat menguji hasilnya:

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

Keluaran kaedah printNameList ():

[John, Adam, Harry]

3. Tetapkan Dengan Suntikan Konstruktor

Untuk menetapkan 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 kita mahu menggunakan suntikan pembina untuk memulakan penjana nameSet harta . Ini memerlukan perubahan dalam kelas konfigurasi:

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

4. Peta Dengan Suntikan Setter

Mengikuti logik yang sama, mari tambahkan medan nameMap untuk menunjukkan suntikan 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 mempunyai kaedah setter untuk menggunakan suntikan ketergantungan setter . Kami juga perlu menambahkan kod yang memulakan peta 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; }

Hasilnya setelah menggunakan kaedah printNameMap () :

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

5. Menyuntik Rujukan Kacang

Mari kita lihat contoh di mana kita menyuntikkan rujukan kacang sebagai unsur koleksi.

Pertama, mari buat kacang:

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

Dan menambah List of BaeldungBean sebagai harta kepada CollectionsBean kelas:

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

Seterusnya, kami menambahkan kaedah kilang 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 }

Bekas Spring menyuntikkan kacang individu dari jenis BaeldungBean ke dalam satu koleksi.

Untuk menguji ini, kami menggunakan kaedah collectionsBean.printBeanList () . Keluaran menunjukkan nama kacang sebagai elemen senarai:

[John, Harry, Adam]

Sekarang, mari kita pertimbangkan senario ketika tidak ada BaeldungBean . Sekiranya tidak ada BaeldungBean yang terdaftar dalam konteks aplikasi, Spring akan membuang pengecualian kerana ketergantungan yang diperlukan hilang.

Kita boleh menggunakan @Autowired (diperlukan = false) untuk menandakan pergantungan sebagai pilihan. Daripada membuang pengecualian, beanList tidak akan diinisialisasi dan nilainya akan tetap kosong .

Sekiranya kita memerlukan senarai kosong dan bukannya nol, kita boleh memulakan beanList dengan ArrayList baru :

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

5.1. Menggunakan @Order untuk Menyusun Kacang

Kami dapat menentukan urutan kacang sambil memasukkan ke dalam koleksi .

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

@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"); } }

Bekas spring pertama akan menyuntik kacang dengan nama "Harry" , kerana ia mempunyai nilai pesanan terendah.

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 hasilnya, kami melihat bahawa koleksi kami hanya mempunyai satu elemen:

[John]

6. Menetapkan Senarai Kosong sebagai Nilai Lalai

Kita boleh menetapkan nilai lalai untuk properti Senarai yang disuntik sebagai senarai kosong dengan menggunakan kaedah statik Collections.emptyList () :

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

Sekiranya kita menjalankannya dengan kunci "names.list" tidak diinisialisasi melalui fail sifat:

collectionsBean.printNameListWithDefaults();

Kami akan mendapat senarai kosong sebagai output:

[ ]

7. Ringkasan

Dengan panduan ini, kami belajar bagaimana menyuntik pelbagai jenis koleksi Java menggunakan rangka Spring.

Kami juga memeriksa suntikan dengan jenis rujukan dan bagaimana memilih atau memesannya di dalam koleksi.

Seperti biasa, kod lengkap boleh didapati dalam projek GitHub.