wiele pakietów w kontekście: skanowanie komponentów, wiosenna konfiguracja


185

Jak mogę dodać wiele pakietów w pliku spring-servlet.xml w context:component-scanelemencie?

próbowałem

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

i

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

i

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

ale dostał błąd:

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

Odpowiedzi:


272

Prawidłowe jest następujące podejście:

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

Zauważ, że błąd narzeka x.y.z.dao.daoservice.LoginDAO, którego nie ma w powyższych pakietach, być może zapomniałeś go dodać:

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

5
Ta odpowiedź sugeruje, że nie ma rekurencji dla członków bazowego pakietu ale jest: stackoverflow.com/questions/7774295/... . Proponuję nieco zmienić odpowiedź, aby to wyjaśnić.
djangofan


43

Możesz dodać wiele pakietów podstawowych (patrz odpowiedź axtavt ), ale możesz także filtrować to, co jest skanowane w pakiecie podstawowym:

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

2
@shams nie musisz mnie sir, ale jeśli odpowiedź jest prawidłowa, oznacz ją jako zaakceptowaną (kliknij znacznik wyboru)
Sean Patrick Floyd

1
Dlaczego nie możesz dodać wielu pakietów podstawowych? Na przykład „org.example, com.example”?
Shervin Asgari,

@Shervin możesz. dokładnie tak jak napisałeś. „Alternatywnie możesz podać listę oddzieloną przecinkami, która zawiera pakiet nadrzędny każdej klasy.” (zobacz także oczekiwaną odpowiedź)
Sean Patrick Floyd

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

będzie działać, ponieważ reszta pakietów to podpakiety „xyz”. Dlatego nie musisz wspominać o każdej paczce z osobna.


2
Dobrze! Może to był kolejny powód, ale to po prostu nie działało dla mnie z wiosennym mvc dla portletów ...
elcadro

@elcadro musiało być z innych powodów, ponieważ jest to dobrze udokumentowana i reklamowana funkcja
eis

Nie mogę powiedzieć przeciwnie, ponieważ wiele osób mnie poprawia. Chciałbym móc dowiedzieć się, dlaczego to nie działało dla mnie ... W każdym razie dzięki!
elcadro

Czy dotyczy to nawet konfiguracji opartej na adnotacjach?
Nikhil Sahu

6

Inne ogólne podejście do adnotacji:

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

2

Jeśli xyz jest powszechnym pakietem, możesz użyć:

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

obejmie cały pakiet, który zaczyna się od xyz, taki jak: xyzcontroller, xyzservice itp.


1

Na przykład masz pakiet „com.abc” i masz w nim wiele pakietów, możesz użyć jak

@ComponentScan("com.abc")

0

Opóźniona odpowiedź, ale w celu dostarczenia wielu pakietów przy użyciu podejścia opartego na adnotacjach, możemy użyć w następujący sposób:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.