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.