Perbezaan Antara @ComponentScan dan @EnableAutoConfiguration in Spring Boot

1. Pengenalan

Dalam tutorial ini cepat, kita akan belajar tentang perbezaan antara @ComponentScan dan @EnableAutoConfiguration penjelasan dalam Rangka Kerja Spring.

2. Anotasi Musim Bunga

Anotasi mempermudah konfigurasi suntikan kebergantungan pada musim bunga. Daripada menggunakan fail konfigurasi XML, kita dapat menggunakan anotasi Spring Bean pada kelas dan kaedah untuk menentukan kacang . Selepas itu, bekas Spring IoC mengkonfigurasi dan menguruskan kacang.

Berikut adalah gambaran keseluruhan anotasi yang akan kita bincangkan dalam artikel ini:

  • @ComponentScan mengimbas komponen Spring yang dianotasi
  • @EnableAutoConfiguration digunakan untuk mengaktifkan konfigurasi automatik

Sekarang mari kita perhatikan perbezaan antara dua anotasi ini.

3. Bagaimana Mereka Berbeza

Perbezaan utama antara anotasi ini ialah @ComponentScan mengimbas komponen Spring sementara @EnableAutoConfiguration digunakan untuk konfigurasi automatik kacang yang terdapat di classpath dalam aplikasi Spring Boot .

Sekarang, mari kita teliti dengan lebih terperinci.

3.1. @ComponentScan

Semasa mengembangkan aplikasi, kita perlu memberitahu kerangka Spring untuk mencari komponen yang dikendalikan oleh Spring. @ComponentScan membolehkan Spring mengimbas perkara seperti konfigurasi, pengawal, perkhidmatan, dan komponen lain yang kami tentukan .

Khususnya, @ComponentScananotasi digunakan dengan anotasi @Configuration untuk menentukan pakej Spring untuk mengimbas komponen:

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

Sebagai alternatif, Spring juga boleh mula mengimbas dari pakej yang ditentukan, yang dapat kita tentukan menggunakan basePackageClasses () atau basePackages () . Sekiranya tidak ada pakej yang ditentukan, maka ia menganggap pakej kelas yang menyatakan anotasi @ComponentScan sebagai pakej permulaan :

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); // ... } }

Sebagai contoh, Spring akan mengimbas pakej penjagaan kesihatan dan pekerja dan kelas Guru untuk komponen.

Spring mencari pakej yang ditentukan bersama dengan semua sub-pakejnya untuk kelas yang diberi anotasi dengan @Configuration . Selain itu , yang Konfigurasi kelas boleh mengandungi @Bean anotasi, yang mendaftar kaedah kacang dalam permohonan konteks Spring . Selepas itu, anotasi @ ComponentScan dapat mengesan kacang seperti itu secara automatik:

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

Tambahan pula, anotasi @ ComponentScan juga dapat mengimbas, mengesan, dan mendaftarkan kacang untuk kelas yang diberi anotasi dengan @Component, @Controller, @Service , dan @Repository .

Sebagai contoh, kita boleh membuat kelas Karyawan sebagai komponen yang dapat diimbas dengan anotasi @ ComponentScan :

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

3.2. @EnableAutoConfiguration

The @EnableAutoConfiguration anotasi membolehkan Spring Boot untuk auto-configure konteks permohonan itu . Oleh itu, ia secara automatik membuat dan mendaftarkan kacang berdasarkan kedua-dua fail balang yang disertakan di jalan kelas dan kacang yang ditentukan oleh kami.

Sebagai contoh, semasa kita menentukan pergantungan spring-boot-starter-web di classpath kami, Spring boot auto-configur Tomcat dan Spring MVC Namun, konfigurasi automatik ini kurang didahulukan sekiranya kita menentukan konfigurasi kita sendiri.

Pakej kelas yang menyatakan anotasi @EnableAutoConfiguration dianggap sebagai lalai . Oleh itu, kita harus selalu menerapkan anotasi @EnableAutoConfiguration dalam pakej root supaya setiap sub-pakej dan kelas dapat diperiksa:

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

Tambahan pula, anotasi @EnableAutoConfiguration menyediakan dua parameter untuk mengecualikan parameter apa pun secara manual:

Kita boleh menggunakan exclude untuk menonaktifkan senarai kelas yang tidak mahu dikonfigurasikan secara automatik:

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

Kita boleh menggunakan excludeName untuk menentukan senarai nama kelas yang memenuhi syarat yang ingin kita kecualikan dari konfigurasi automatik:

@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 gabungan dari tiga anotasi @Configuration, @EnableAutoConfiguration, dan @ComponentScan dengan atribut lalai mereka :

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

4. Kesimpulan

Dalam artikel ini, kami mengetahui tentang perbezaan antara @ComponentScan dan @EnableAutoConfiguration di Spring Boot.

Seperti biasa, kod untuk contoh ini boleh didapati di GitHub.