Perbezaan antara vs

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan belajar tentang perbezaan antara dua elemen konfigurasi XML utama Spring: dan .

2. Definisi Kacang

Seperti yang kita semua ketahui, Spring memberi kita dua cara untuk menentukan kacang dan kebergantungan kita: konfigurasi XML dan anotasi Java. Kami juga dapat mengkategorikan anotasi Spring di bawah dua kumpulan: anotasi suntikan ketergantungan dan anotasi kacang.

Sebelum penjelasan, kami harus menentukan secara manual semua kacang dan kebergantungan kami dalam fail konfigurasi XML. Sekarang berkat anotasi Spring, secara automatik dapat menemui dan memasang semua kacang dan pergantungan untuk kita . Jadi, sekurang-kurangnya kita dapat menghilangkan XML yang diperlukan untuk kacang dan pergantungan.

Walau bagaimanapun, kita harus ingat bahawa anotasi tidak berguna kecuali kita mengaktifkannya . Untuk mengaktifkannya, kita boleh menambahkannya atau di atas fail XML kami.

Di bahagian ini, kita akan melihat caranya dan berbeza antara satu sama lain dari segi cara mereka mengaktifkan anotasi.

3. Pengaktifan Anotasi oleh < konteks: annotation-config>

The anotasi digunakan terutamanya untuk mengaktifkan anotasi suntikan kebergantungan. @Autowired , @Qualifier , @PostConstruct , @PreDestroy , dan @Resource adalah beberapa yangdapat menyelesaikan.

Mari buat contoh mudah untuk melihat bagaimana dapat mempermudah konfigurasi XML untuk kita.

Pertama, mari buat kelas dengan bidang kebergantungan:

public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}

Sekarang, mari kita tentukan kacang kita.

Sebelum melangkah lebih jauh mari kita nyatakan bahawa kita masih perlu menyatakan kacang dalam XML. Ini keranamengaktifkan anotasi hanya untuk kacang yang sudah didaftarkan dalam konteks aplikasi .

Seperti yang dapat dilihat di sini, kami beranotasi yang accountService bidang menggunakan @Autowired . @Autowired memberitahu Spring bahawa bidang ini adalah pergantungan yang perlu disambungkan secara automatik oleh kacang yang sepadan.

Jika kita tidak menggunakan @Autowired , maka kita perlu menetapkan accountService pergantungan secara manual:

Sekarang, kita boleh merujuk kepada kacang dan pergantungan kita dalam ujian unit:

@Test public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml"); UserService userService = context.getBean(UserService.class); AccountService accountService = context.getBean(AccountService.class); Assert.assertNotNull(userService); Assert.assertNotNull(accountService); Assert.assertNotNull(userService.getAccountService()); }

Hmm, ada yang tidak kena di sini. Nampaknya Spring tidak menyambung perkhidmatan akaun walaupun kami memberi komen oleh @Autowired . Nampaknya @Autowired tidak aktif. Untuk menyelesaikan masalah ini, kami hanya akan menambahkan baris berikut di atas fail XML kami:

4. Pengaktifan Anotasi oleh < konteks: komponen-scan>

Sama seperti , dapat mengenali dan memproses anotasi suntikan ketergantungan juga. Lebih-lebih lagi, menyedari anotasi kacang bahawa tidak mengesan .

Pada asasnya, mengesan anotasi dengan imbasan pakej . Untuk meletakkannya secara berbeza, ia memberitahu Spring paket mana yang perlu diimbas untuk mencari kacang atau komponen yang dianotasi.

@Component , @Repository , @Service , @Controller , @RestController , dan @Configuration adalah beberapa yangdapat mengesan .

Sekarang mari kita lihat bagaimana kita dapat mempermudah contoh sebelumnya:

@Component public class UserService { @Autowired private AccountService accountService; } 
@Component public class AccountService {}

Di sini, anotasi @Component menandakan kelas kami sebagai kacang . Sekarang, kita dapat membersihkan semua definisi kacang dari fail XML kami. Dan tentu saja, kita perlu menjaga di atasnya:

Akhirnya, mari kita perhatikan bahawa Spring akan mencari kacang dan ketergantungan yang teranotasi di bawah pakej yang ditunjukkan oleh atribut paket-asas .

5. Kesimpulan

Dalam tutorial ini, kami melihat perbezaan antara dan .

Contoh kod, seperti biasa, selesai di GitHub.