Perbedaan Antara @ComponentScan dan @EnableAutoConfiguration di Spring Boot

1. Perkenalan

Dalam tutorial ini cepat, kita akan belajar tentang perbedaan antara @ComponentScan dan @EnableAutoConfiguration penjelasan di Spring Framework.

2. Anotasi Musim Semi

Anotasi mempermudah konfigurasi injeksi dependensi di Spring. Daripada menggunakan file konfigurasi XML, kita bisa menggunakan penjelasan Spring Bean pada kelas dan metode untuk mendefinisikan kacang . Setelah itu, container IoC Spring mengonfigurasi dan mengelola bean.

Berikut ikhtisar anotasi yang akan kita bahas di artikel ini:

  • @ComponentScan memindai komponen Spring yang dianotasi
  • @EnableAutoConfiguration digunakan untuk mengaktifkan konfigurasi otomatis

Sekarang mari kita lihat perbedaan antara kedua anotasi ini.

3. Bagaimana Mereka Berbeda

Perbedaan utama antara anotasi ini adalah @ComponentScan memindai komponen Spring sementara @EnableAutoConfiguration digunakan untuk kacang yang mengonfigurasi otomatis yang ada di classpath dalam aplikasi Spring Boot .

Sekarang, mari kita bahas lebih detail.

3.1. @Komponen

Saat mengembangkan aplikasi, kita perlu memberi tahu framework Spring untuk mencari komponen yang dikelola Spring. @ComponentScan memungkinkan Spring memindai hal-hal seperti konfigurasi, pengontrol, layanan, dan komponen lain yang kami tentukan .

Secara khusus, @ComponentScananotasi digunakan dengan anotasi @Configuration untuk menentukan paket Spring untuk memindai komponen:

@Configuration @ComponentScan public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

Alternatifnya, Spring juga bisa mulai memindai dari paket yang ditentukan, yang bisa kita definisikan menggunakan basePackageClasses () atau basePackages () . Jika tidak ada paket yang ditentukan, maka itu menganggap paket kelas yang mendeklarasikan anotasi @ComponentScan sebagai paket awal :

package com.baeldung.annotations.componentscanautoconfigure; // ... @Configuration @ComponentScan(basePackages = {"com.baeldung.annotations.componentscanautoconfigure.healthcare", "com.baeldung.annotations.componentscanautoconfigure.employee"}, basePackageClasses = Teacher.class) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

Dalam contoh, Spring akan memindai paket perawatan kesehatan dan karyawan serta kelas Guru untuk komponen.

Spring mencari paket yang ditentukan bersama dengan semua sub-paketnya untuk kelas yang dianotasi dengan @Configuration . Selain itu , para Konfigurasi kelas dapat berisi @Bean penjelasan, yang mendaftarkan metode sebagai kacang dalam konteks aplikasi musim semi . Setelah itu, anotasi @ ComponentScan dapat mendeteksi kacang seperti itu secara otomatis:

@Configuration public class Hospital { @Bean public Doctor getDoctor() { return new Doctor(); } }

Selain itu, anotasi @ ComponentScan juga dapat memindai, mendeteksi, dan mendaftarkan kacang untuk kelas yang dianotasi dengan @Component, @Controller, @Service , dan @Repository .

Misalnya, kita dapat membuat kelas Karyawan sebagai komponen yang dapat dipindai oleh anotasi @ ComponentScan :

@Component("employee") public class Employee { // ... }

3.2. @EnableAutoConfiguration

The @EnableAutoConfiguration penjelasan memungkinkan Musim Semi Boot untuk auto-configure konteks aplikasi . Oleh karena itu, secara otomatis membuat dan mendaftarkan kacang berdasarkan file jar yang disertakan di classpath dan kacang yang kami definisikan.

Misalnya, saat kita mendefinisikan dependensi spring-boot-starter-web di classpath kita, Spring boot otomatis mengonfigurasi Tomcat dan Spring MVC. Namun, konfigurasi otomatis ini kurang diutamakan jika kita menentukan konfigurasi kita sendiri.

Paket kelas yang mendeklarasikan anotasi @EnableAutoConfiguration dianggap sebagai default . Oleh karena itu, kita harus selalu menerapkan anotasi @EnableAutoConfiguration dalam paket root sehingga setiap sub-paket dan kelas dapat diperiksa:

@Configuration @EnableAutoConfiguration public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

Selain itu, anotasi @EnableAutoConfiguration menyediakan dua parameter untuk mengecualikan parameter apa pun secara manual:

Kita dapat menggunakan exclude untuk menonaktifkan daftar kelas yang tidak ingin kita konfigurasi secara otomatis:

@Configuration @EnableAutoConfiguration(exclude={JdbcTemplateAutoConfiguration.class}) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

Kita dapat menggunakan excludeName untuk menentukan daftar nama kelas yang sepenuhnya memenuhi syarat yang ingin kita kecualikan dari konfigurasi otomatis:

@Configuration @EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"}) public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

Sejak Spring Boot 1.2.0, kita dapat menggunakan anotasi @SpringBootApplication , yang merupakan kombinasi dari tiga anotasi @Configuration, @EnableAutoConfiguration, dan @ComponentScan dengan atribut defaultnya :

@SpringBootApplication public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args); // ... } }

4. Kesimpulan

Dalam artikel ini, kami mempelajari perbedaan antara @ComponentScan dan @EnableAutoConfiguration di Spring Boot.

Seperti biasa, kode untuk contoh ini tersedia di GitHub.