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.