Apa itu Spring Bean?

1. Gambaran keseluruhan

Bean adalah konsep utama Spring Framework. Oleh itu, memahami konsep ini sangat penting untuk memahami kerangka kerja dan menggunakannya dengan cara yang berkesan.

Malangnya, tidak ada jawapan yang jelas untuk soalan mudah - apa sebenarnya kacang musim bunga. Beberapa penjelasan mencapai tahap yang rendah sehingga gambaran besar tidak terjawab, sedangkan ada yang terlalu kabur.

Tutorial ini akan cuba menjelaskan topik tersebut, bermula dengan penerangan dalam dokumentasi rasmi.

2. Definisi Kacang

Berikut adalah definisi kacang dalam dokumentasi Spring Framework:

Pada musim bunga, objek yang membentuk tulang belakang aplikasi anda dan yang dikendalikan oleh bekas Spring IoC disebut kacang. Kacang adalah objek yang disusun, dipasang, dan diuruskan oleh bekas Spring IoC.

Definisi ini ringkas dan tepat, tetapi terlepas satu perkara penting - Spring IoC container. Mari pergi ke lubang arnab untuk melihat apa itu dan faedah yang dibawanya.

3. Pembalikan Kawalan

Ringkasnya, Inversion of Control, atau pendeknya IoC, adalah proses di mana objek menentukan kebergantungannya tanpa membuatnya. Objek ini menyerahkan tugas membina kebergantungan seperti itu ke wadah IoC.

Mari kita mulakan dengan pengisytiharan beberapa kelas domain sebelum menyelami IoC.

3.1. Kelas Domain

Andaikan kita mempunyai perisytiharan kelas:

public class Company { private Address address; public Company(Address address) { this.address = address; } // getter, setter and other properties }

Kelas ini memerlukan kolaborator jenis Alamat :

public class Address { private String street; private int number; public Address(String street, int number) { this.street = street; this.number = number; } // getters and setters }

3.2. Pendekatan Tradisional

Biasanya, kami membuat objek dengan pembina kelas mereka:

Address address = new Address("High Street", 1000); Company company = new Company(address);

Tidak ada yang salah dengan pendekatan ini, tetapi bukankah lebih baik untuk menguruskan pergantungan dengan cara yang lebih baik?

Bayangkan aplikasi dengan berpuluh-puluh atau bahkan ratusan kelas. Kadang-kadang kita mahu berkongsi satu contoh kelas di seluruh aplikasi, pada masa lain kita memerlukan objek yang terpisah untuk setiap kes penggunaan, dan seterusnya.

Menguruskan sebilangan objek tidak kurang daripada mimpi buruk. Di sinilah Inversion of Control datang untuk menyelamatkan.

Daripada membina pergantungan dengan sendirinya, objek dapat mengambil kebergantungannya dari wadah IoC. Yang perlu kita lakukan hanyalah menyediakan wadah dengan metadata konfigurasi yang sesuai.

3.3. Konfigurasi Kacang

Pertama, mari kita hiasi kelas Syarikat dengan anotasi @Component :

@Component public class Company { // this body is the same as before }

Berikut adalah kelas konfigurasi yang membekalkan metadata kacang ke bekas IoC:

@Configuration @ComponentScan(basePackageClasses = Company.class) public class Config { @Bean public Address getAddress() { return new Address("High Street", 1000); } }

Kelas konfigurasi menghasilkan kacang Jenis alamat . Ini juga membawa anotasi @ComponentScan , yang memerintahkan bekas untuk mencari kacang dalam bungkusan yang mengandungi kelas Syarikat .

Apabila bekas Spring IoC membina objek jenis itu, semua objek tersebut dipanggil Spring kacang kerana ia diuruskan oleh bekas IoC.

3.4. IoC dalam Tindakan

Oleh kerana kami menentukan kacang dalam kelas konfigurasi, kami memerlukan contoh kelas AnnotationConfigApplicationContext untuk membina wadah:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

Ujian pantas mengesahkan kewujudan dan juga nilai harta tanah kacang kami:

Company company = context.getBean("company", Company.class); assertEquals("High Street", company.getAddress().getStreet()); assertEquals(1000, company.getAddress().getNumber());

Hasilnya membuktikan bahawa bekas IoC telah membuat dan memulakan kacang dengan betul.

4. Kesimpulan

Tutorial ini memberi penerangan ringkas mengenai kacang Spring dan hubungannya dengan bekas IoC.

Kod sumber lengkap untuk tutorial ini boleh didapati di GitHub.