vários pacotes no contexto: verificação de componentes, configuração de primavera

185

Como posso adicionar vários pacotes no arquivo spring-servlet.xml no context:component-scanelemento?

eu tentei

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

e

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

e

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

mas obteve erro:

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

Respostas:

272

A seguinte abordagem está correta:

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

Observe que o erro reclama x.y.z.dao.daoservice.LoginDAO, que não está nos pacotes mencionados acima, talvez você tenha esquecido de adicioná-lo:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 
axtavt
fonte
5
Esta resposta implica que NÃO existe recursão para os membros do pacote base, MAS EXISTE: stackoverflow.com/questions/7774295/… . Eu sugeriria alterar um pouco a resposta para deixar isso claro.
djangofan
52

Abordagem de anotação

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
fonte
Obrigatoriamente precisamos adicionar pacotes específicos ou ele pode verificar sub pacotes automaticamente se definirmos apenas o pacote de nível superior?
precisa
@NikhilSahu não, é uma varredura recursiva (Primavera 3>)
biology.info
Link SO para obter mais informações: stackoverflow.com/questions/10794587/…
dkb
43

Você pode adicionar vários pacotes base (consulte a resposta do axtavt ), mas também pode filtrar o que é verificado dentro do pacote base:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>
Sean Patrick Floyd
fonte
2
@shams há necessidade de senhor me, mas se a resposta for correta você deve marcá-lo como aceito (clique a marca de seleção)
Sean Patrick Floyd
1
Por que você não pode adicionar vários pacotes base? Como por exemplo "org.example, com.example"?
Shervin Asgari
@ Shervin você pode. exatamente como você escreveu. "Como alternativa, você pode especificar uma lista separada por vírgula que inclua o pacote pai de cada classe." (também veja a resposta esperada) #
217 Sean Sean Floyd
19
<context:component-scan base-package="x.y.z"/>

funcionará, já que o restante dos pacotes são subpacotes de "xyz". Assim, você não precisa mencionar cada pacote individualmente.

Irene
fonte
2
Está bem! Talvez fosse outra razão, mas isso simplesmente não funciona para mim com Spring MVC para portlets ...
elcadro
@elcadro deve ter sido por outras razões, uma vez que este está bem documentado e recurso anunciado
eis
Bem, não posso dizer o contrário, pois muitas pessoas estão me corrigindo. Eu gostaria de descobrir por que isso não funcionou para mim ... Obrigado mesmo assim!
Elcadro #
Isso vale mesmo para a configuração baseada em anotação?
Nikhil Sahu
6

Outra abordagem geral de anotação:

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

Se xyz é o pacote comum, você pode usar:

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

incluirá todo o pacote iniciado com xyz como: xyzcontroller, xyzservice etc.

Amit Sharma
fonte
1

Por exemplo, você tem o pacote "com.abc" e vários pacotes dentro dele. Você pode usar como

@ComponentScan("com.abc")
sForSujit
fonte
0

Uma resposta atrasada, mas para fornecer vários pacotes usando a abordagem baseada em anotação, podemos usar como abaixo:

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

Santhosh K Thadka
fonte