1. Gambaran keseluruhan
Dalam tutorial ini, kita akan membahas pengimbasan komponen pada musim bunga. Semasa bekerja dengan Spring, kami dapat memberi penjelasan pada kelas kami untuk menjadikannya kacang Spring. Tetapi, selain itu, kita dapat memberitahu Spring di mana untuk mencari kelas yang diberi anotasi ini kerana tidak semua mereka mesti menjadi kacang dalam jangka masa tertentu ini.
Sudah tentu, terdapat beberapa lalai untuk pengimbasan komponen tetapi kita juga dapat menyesuaikan pakej untuk carian.
Pertama, mari kita lihat tetapan lalai.
2. @ComponentScan Tanpa Hujah
2.1. Menggunakan @ComponentScan dalam Aplikasi Spring
Dengan Spring, kami menggunakan anotasi @ComponentScan bersama dengan anotasi @Configuration untuk menentukan pakej yang ingin kami pindai . @ComponentScan tanpa argumen memberitahu Spring untuk mengimbas pakej semasa dan semua sub-pakejnya.
Katakan kita mempunyai yang berikut @Configuration dalam com.baeldung.componentscan.springapp pakej:
@Configuration @ComponentScan public class SpringComponentScanApp { private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean() { return new ExampleBean(); } public static void main(String[] args) { applicationContext = new AnnotationConfigApplicationContext(SpringComponentScanApp.class); for (String beanName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanName); } } }
Juga, katakan kita mempunyai komponen Kucing dan Anjing dalam pakej com.baeldung.componentscan.springapp.animals :
package com.baeldung.componentscan.springapp.animals; // ... @Component public class Cat {}
package com.baeldung.componentscan.springapp.animals; // ... @Component public class Dog {}
Dan akhirnya, kami mempunyai komponen Rose dalam pakej com.baeldung.componentscan.springapp.flowers :
package com.baeldung.componentscan.springapp.flowers; // ... @Component public class Rose {}
Keluaran kaedah utama () akan mengandungi semua biji pakej com.baeldung.componentscan.springapp dan sub-pakejnya:
springComponentScanApp cat dog rose exampleBean
Perhatikan bahawa kelas aplikasi utama juga kacang kerana dijelaskan dengan @Configuration, yang merupakan @Component .
Juga, perhatikan bahawa kelas aplikasi utama dan kelas konfigurasi tidak semestinya sama. Sekiranya mereka berbeza, tidak menjadi masalah di mana meletakkan kelas aplikasi utama. Hanya lokasi kelas konfigurasi yang penting kerana pengimbasan komponen bermula dari pakejnya secara lalai .
Akhir sekali, perhatikan bahawa dalam contoh kami @ComponentScan bersamaan dengan:
@ComponentScan(basePackages = "com.baeldung.componentscan.springapp")
di mana argumen basePackages adalah pakej atau pelbagai pakej untuk pengimbasan.
2.2. Menggunakan @ComponentScan dalam Aplikasi Spring Boot
Caranya dengan Spring Boot adalah banyak perkara berlaku secara tidak langsung. Kami menggunakan anotasi @SpringBootApplication , tetapi ini hanya gabungan tiga anotasi:
@Configuration @EnableAutoConfiguration @ComponentScan
Mari buat struktur yang serupa dalam pakej com.baeldung.componentscan.springbootapp . Kali ini aplikasi utama adalah:
package com.baeldung.componentscan.springbootapp; // ... @SpringBootApplication public class SpringBootComponentScanApp { private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean() { return new ExampleBean(); } public static void main(String[] args) { applicationContext = SpringApplication.run(SpringBootComponentScanApp.class, args); checkBeansPresence( "cat", "dog", "rose", "exampleBean", "springBootComponentScanApp"); } private static void checkBeansPresence(String... beans) { for (String beanName : beans) { System.out.println("Is " + beanName + " in ApplicationContext: " + applicationContext.containsBean(beanName)); } } }
Semua pakej dan kelas lain tetap sama, kami akan menyalinnya ke pakej com.baeldung.componentscan.springbootapp yang berdekatan .
Spring Boot mengimbas pakej yang serupa dengan contoh sebelumnya. Mari periksa output:
Is cat in ApplicationContext: true Is dog in ApplicationContext: true Is rose in ApplicationContext: true Is exampleBean in ApplicationContext: true Is springBootComponentScanApp in ApplicationContext: true
Sebab kami hanya memeriksa biji kacang dalam contoh kedua kami (berbanding dengan mencetak semua biji), kerana keluarannya terlalu besar.
Ini kerana anotasi @EnableAutoConfiguration yang tersirat yang menjadikan Spring Boot membuat banyak kacang secara automatik, bergantung pada kebergantungan dalam fail pom.xml .
3. @ComponentScan With Argumen
Sekarang mari sesuaikan jalan untuk mengimbas. Sebagai contoh, katakan kita mahu mengecualikan kacang Rose .
3.1. @ComponentScan untuk Pakej Khusus
Kita boleh melakukannya dengan beberapa cara. Pertama, kita boleh menukar pakej asas:
@ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") @Configuration public class SpringComponentScanApp { // ... }
Sekarang outputnya adalah:
springComponentScanApp cat dog exampleBean
Mari lihat apa di sebalik ini:
- springComponentScanApp dibuat kerana konfigurasi diteruskan sebagai argumen kepada AnnotationConfigApplicationContext
- exampleBean adalah kacang yang dikonfigurasi di dalam konfigurasi
- kucing dan anjing terdapat dalam pakej com.baeldung.componentscan.springapp.animals yang ditentukan
Semua penyesuaian yang disenaraikan di atas juga berlaku di Spring Boot juga. Kita boleh menggunakan @ComponentScan bersama-sama dengan @SpringBootApplication dan hasilnya akan sama:
@SpringBootApplication @ComponentScan(basePackages = "com.baeldung.componentscan.springbootapp.animals")
3.2. @ComponentScan dengan Pengecualian
Cara lain adalah dengan menggunakan penapis, menentukan corak untuk kelas dikecualikan:
@ComponentScan(excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX, pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*"))
Kami juga boleh memilih jenis penapis yang berbeza, kerana anotasi menyokong beberapa pilihan fleksibel untuk menyaring kelas yang diimbas :
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class))
4. Pakej Lalai
Kita harus mengelakkan meletakkan kelas @Configuration dalam pakej lalai (iaitu dengan tidak menentukan paket sama sekali). Dalam kes ini, Spring mengimbas semua kelas di semua balang di lorong kelas. Itu menyebabkan kesilapan dan aplikasi mungkin tidak bermula.
5. Kesimpulan
Dalam artikel ini, kami telah mengetahui pakej Spring scan secara lalai dan cara menyesuaikan jalur ini.
Seperti biasa, kod lengkap boleh didapati di GitHub.