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:
Shams
źródło

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" /> 
axtavt
źródło
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
52

Podejście do adnotacji

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
źródło
Czy musimy obowiązkowo dodawać określone pakiety, czy może automatycznie skanować paczki podrzędne, jeśli zdefiniujemy tylko pakiet najwyższego poziomu?
Nikhil Sahu,
@NikhilSahu nie, to skan rekurencyjny (Wiosna 3>)
biology.info
Link SO, aby uzyskać więcej informacji: stackoverflow.com/questions/10794587/…
dkb
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>
Sean Patrick Floyd
źródło
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.

Irene
źródło
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"})
Robocide
źródło
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.

Amit Sharma
źródło
1

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

@ComponentScan("com.abc")
sForSujit
źródło
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"})

Santhosh K Thadka
źródło