bağlamda çoklu paketler: bileşen tarama, yay konfigürasyonu


185

Element içindeki spring-servlet.xml dosyasına nasıl birden fazla paket ekleyebilirim context:component-scan?

denedim

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

ve

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

ve

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

ama hata var:

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

Yanıtlar:


272

Aşağıdaki yaklaşım doğrudur:

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

Hata x.y.z.dao.daoservice.LoginDAO, yukarıda belirtilen paketlerde bulunmayan, şikayet ettiğine dikkat edin , belki de eklemeyi unuttunuz:

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

5
Bu cevap, temel paket üyeleri için özyineleme OLMADIĞINI ima eder, AMA IS: stackoverflow.com/questions/7774295/… . Bunu netleştirmek için cevabı biraz değiştirmenizi öneririm.
djangofan


43

Birden fazla temel paket ekleyebilirsiniz ( axtavt'ın cevabına bakın ), ancak temel paketin içinde tarananları da filtreleyebilirsiniz :

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@shams bana efendim gerek yok, ancak cevap doğruysa kabul edildi olarak işaretlemelisiniz (onay işaretini tıklayın)
Sean Patrick Floyd

1
Neden birden fazla temel paket ekleyemiyorsunuz? Örneğin "org.example, com.example" gibi mi?
Shervin Asgari

@Shervin yapabilirsin. aynen yazdığınız gibi. "Alternatif olarak, her sınıfın üst paketini içeren virgülle ayrılmış bir liste belirtebilirsiniz." (ayrıca beklenen cevaba bakınız)
Sean Patrick Floyd

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

Paketlerin geri kalanı "xyz" alt paketleri olduğundan çalışacaktır. Bu nedenle, her paketi ayrı ayrı belirtmeniz gerekmez.


2
Tamam! Belki başka bir nedendi, ama bu sadece portletler için bahar mvc ile benim için çalışmadı ...
elcadro

@elcadro başka nedenlerden geçmiş olmalı, çünkü bu iyi belgelenmiş ve reklamı yapılmış bir özellik
eis

Pek çok insan beni düzelttiği için tam tersini söyleyemem. Keşke bunun benim için neden işe yaramadığını bulabilseydim ... Yine de teşekkürler!
elcadro

Ek açıklama tabanlı yapılandırma için bile geçerli mi?
Nikhil Sahu

6

Başka bir genel Ek Açıklama yaklaşımı:

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

2

Xyz ortak paket ise, şunları kullanabilirsiniz:

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

xyz ile başlayan tüm paketi içerecektir: xyzcontroller, xyzservice vb.


1

Örneğin, "com.abc" paketiniz var ve içinde birden fazla paket var.

@ComponentScan("com.abc")

0

Gecikmeli yanıt ancak ek açıklama tabanlı yaklaşım kullanarak birden fazla paket vermek için aşağıdaki gibi kullanabiliriz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.