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:

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" /> 

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


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>

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.


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"})

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.


1

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

@ComponentScan("com.abc")

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"})

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.