Saya menggunakan Spring 3.1 dan melakukan bootstrap aplikasi menggunakan atribut @Configuration
and @ComponentScan
.
Awal yang sebenarnya dilakukan dengan
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);
Kelas Konfigurasi ini dianotasi dengan
@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass
dan ini berfungsi dengan baik. Namun saya ingin lebih spesifik tentang paket yang saya pindai, jadi saya mencoba.
@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass
Namun ini gagal dengan kesalahan yang memberi tahu saya bahwa tidak dapat menemukan komponen yang ditentukan menggunakan @Component
anotasi.
Apa cara yang benar untuk melakukan apa yang saya cari?
Terima kasih
java
spring
annotations
Orang Pemrograman
sumber
sumber
Jawaban:
@ComponentScan menggunakan string array, seperti ini:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Saat Anda memberikan beberapa nama paket hanya dalam satu string, Spring menafsirkan ini sebagai satu nama paket, dan karenanya tidak dapat menemukannya.
sumber
Ada alternatif lain yang aman bagi tipe untuk menentukan lokasi paket dasar sebagai String. Lihat API di sini , tetapi saya juga mengilustrasikan di bawah ini:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
Menggunakan penentu basePackageClasses dengan referensi kelas Anda akan memberi tahu Spring untuk memindai paket tersebut (seperti alternatif yang disebutkan ), tetapi metode ini aman untuk tipe dan menambahkan dukungan IDE untuk refactoring di masa mendatang - nilai tambah yang sangat besar dalam buku saya.
Membaca dari API, Spring menyarankan untuk membuat kelas atau antarmuka penanda tanpa operasi di setiap paket yang ingin Anda pindai yang tidak memiliki tujuan lain selain digunakan sebagai referensi untuk / oleh atribut ini.
IMO, saya tidak suka kelas-penanda (tetapi sekali lagi, mereka cukup mirip dengan kelas info paket) tetapi jenis keamanan, dukungan IDE, dan secara drastis mengurangi jumlah paket dasar yang diperlukan untuk disertakan untuk pemindaian ini adalah, tanpa keraguan, pilihan yang jauh lebih baik.
sumber
Berikan nama paket Anda secara terpisah, ini membutuhkan
String[]
untuk nama paket.Daripada ini:
@ComponentScan("com.my.package.first,com.my.package.second")
Gunakan ini:
@ComponentScan({"com.my.package.first","com.my.package.second"})
sumber
Cara lain untuk melakukan ini adalah dengan menggunakan
basePackages
lapangan; yang merupakan bidang di dalam anotasi ComponentScan.@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
Jika Anda melihat anotasi .class ComponentScan dari file jar, Anda akan melihat bidang basePackages yang memuat array Strings
public @interface ComponentScan { String[] basePackages() default {}; }
Atau Anda bisa menyebutkan kelas secara eksplisit. Yang mengambil berbagai kelas
sumber
Anda menggunakan ComponentScan untuk memindai beberapa paket menggunakan
@ComponentScan({"com.my.package.first","com.my.package.second"})
sumber
pastikan Anda telah menambahkan ketergantungan ini di pom.xml Anda
sumber
Anda juga dapat menggunakan anotasi @ComponentScans:
@ComponentScans(value = { @ComponentScan("com.my.package.first"), @ComponentScan("com.my.package.second") })
sumber
Saya menggunakan:
@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
sumber