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:

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" /> 

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


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>

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.


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"})

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.


1

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

@ComponentScan("com.abc")

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"})

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.