Perbedaan antara vs.

1. Ikhtisar

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

2. Definisi Kacang

Seperti yang kita semua tahu, Spring memberi kita dua cara untuk mendefinisikan kacang dan ketergantungan kita: konfigurasi XML dan anotasi Java. Kami juga dapat mengkategorikan anotasi Spring dalam dua kelompok: anotasi injeksi ketergantungan dan anotasi kacang.

Sebelum anotasi, kami harus secara manual mendefinisikan semua kacang dan dependensi kami dalam file konfigurasi XML. Sekarang, berkat penjelasan Spring, ia dapat secara otomatis menemukan dan mentransfer semua kacang dan dependensi kami untuk kami . Jadi, setidaknya kita bisa menghilangkan XML yang dibutuhkan untuk kacang dan dependensi.

Namun, kita harus ingat bahwa anotasi tidak berguna kecuali kita mengaktifkannya . Untuk mengaktifkannya, kita bisa menambahkan atau di atas file XML kami.

Di bagian ini, kita akan melihat caranya dan berbeda satu sama lain dalam hal cara mengaktifkan anotasi.

3. Aktivasi Anotasi dengan < konteks: anotasi-config>

Itu anotasi terutama digunakan untuk mengaktifkan anotasi injeksi ketergantungan. @Autowired , @Qualifier , @PostConstruct , @PreDestroy , dan @Resource adalah beberapa yangbisa menyelesaikan.

Mari kita buat contoh sederhana untuk melihat caranya dapat menyederhanakan konfigurasi XML untuk kita.

Pertama, mari buat kelas dengan bidang ketergantungan:

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

Sekarang, mari kita definisikan kacang kita.

Sebelum melangkah lebih jauh, mari kita tunjukkan bahwa kita masih perlu mendeklarasikan bean dalam XML. Itu karenamengaktifkan anotasi hanya untuk kacang yang sudah terdaftar dalam konteks aplikasi .

Seperti dapat dilihat di sini, kita beranotasi accountService lapangan menggunakan @ Autowired . @Autowired memberi tahu Spring bahwa bidang ini adalah dependensi yang perlu dihubungkan secara otomatis oleh kacang yang cocok.

Jika kami tidak menggunakan @Autowired , maka kami perlu menyetel dependensi accountService secara manual:

Sekarang, kita bisa merujuk kacang dan dependensi kita dalam pengujian 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 salah di sini. Sepertinya Spring tidak menghubungkan akunService meskipun kami memberi anotasi oleh @Autowired . Sepertinya @Autowired tidak aktif. Untuk mengatasi masalah ini, kami hanya akan menambahkan baris berikut di atas file XML kami:

4. Aktivasi Anotasi menurut < konteks: komponen-scan>

Mirip dengan , dapat mengenali dan memproses anotasi injeksi ketergantungan juga. Bahkan, mengenali penjelasan kacang itu tidak mendeteksi .

Pada dasarnya, mendeteksi anotasi dengan pemindaian paket . Dengan kata lain, ia memberi tahu Spring paket mana yang perlu dipindai untuk mencari kacang atau komponen yang dianotasi.

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

Sekarang mari kita lihat bagaimana kita dapat menyederhanakan contoh kita sebelumnya:

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

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

Terakhir, perhatikan bahwa Spring akan mencari kacang beranotasi dan dependensi di bawah paket yang ditunjukkan oleh atribut base-package .

5. Kesimpulan

Dalam tutorial ini, kami melihat perbedaan antara dan .

Contoh kode, seperti biasa, ada di GitHub.