beberapa paket dalam konteks: pemindaian komponen, pegas konfigurasi

185

Bagaimana saya bisa menambahkan beberapa paket dalam file spring-servlet.xml dalam context:component-scanelemen?

saya telah mencoba

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

dan

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

dan

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

tapi ada kesalahan:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:
Syams
sumber

Jawaban:

272

Pendekatan berikut ini benar:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

Perhatikan bahwa kesalahan tersebut dikeluhkan x.y.z.dao.daoservice.LoginDAO, yang tidak ada dalam paket yang disebutkan di atas, mungkin Anda lupa menambahkannya:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 
axtavt
sumber
5
Jawaban ini menyiratkan bahwa TIDAK ada rekursi untuk anggota paket dasar TETAPI ADA: stackoverflow.com/questions/7774295/… . Saya akan menyarankan untuk mengubah sedikit jawabannya agar jelas.
djangofan
52

Pendekatan Anotasi

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
sumber
Apakah kita wajib menambahkan paket tertentu atau dapat memindai sub paket secara otomatis jika kita hanya mendefinisikan paket tingkat atas?
Nikhil Sahu
@NikhilSahu tidak, ini adalah pemindaian rekursif (Spring 3>)
biology.info
Tautan SO untuk info lebih lanjut: stackoverflow.com/questions/10794587/…
dkb
43

Anda dapat menambahkan beberapa paket basis (lihat jawaban axtavt ), tetapi Anda juga dapat memfilter apa yang dipindai di dalam paket dasar:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>
Sean Patrick Floyd
sumber
2
@sams tidak perlu memberi tahu saya, tetapi jika jawabannya benar, Anda harus menandainya sebagai diterima (klik tanda centang)
Sean Patrick Floyd
1
Mengapa Anda tidak bisa menambahkan beberapa paket basis? Seperti misalnya "org.example, com.example"?
Shervin Asgari
@ Shervin kamu bisa. persis seperti yang Anda tulis. "Atau, Anda dapat menentukan daftar yang dipisahkan koma yang menyertakan paket induk dari setiap kelas." (lihat juga jawaban yang diharapkan)
Sean Patrick Floyd
19
<context:component-scan base-package="x.y.z"/>

akan bekerja karena paket lainnya adalah sub paket "xyz". Jadi, Anda tidak perlu menyebutkan setiap paket secara individual.

Irene
sumber
2
Baik! Mungkin itu alasan lain, tetapi ini tidak berhasil untuk saya dengan spring mvc untuk portlets ...
elcadro
@elcadro pasti melalui alasan lain, karena fitur ini didokumentasikan dengan baik dan diiklankan
eis
Yah, saya tidak bisa mengatakan sebaliknya karena banyak orang yang mengoreksi saya. Saya berharap saya bisa menemukan mengapa ini tidak berhasil untuk saya ... Terima kasih!
elcadro
Apakah itu berlaku bahkan untuk konfigurasi berbasis anotasi?
Nikhil Sahu
6

Pendekatan Anotasi umum lainnya:

@ComponentScan(basePackages = {"x.y.z"})
Robocide
sumber
2

Jika xyz adalah paket umum maka Anda dapat menggunakan:

<context:component-scan base-package="x.y.z.*">

itu akan mencakup semua paket yang dimulai dengan xyz seperti: xyzcontroller, xyzservice dll.

Amit Sharma
sumber
1

Misalnya Anda memiliki paket "com.abc" dan Anda memiliki beberapa paket di dalamnya, Anda dapat menggunakan like

@ComponentScan("com.abc")
sForSujit
sumber
0

Respons tertunda tetapi untuk memberikan beberapa paket menggunakan pendekatan berbasis anotasi yang dapat kita gunakan sebagai berikut:

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

Santhosh K Thadka
sumber