【问题标题】:multiple packages in context:component-scan, spring config上下文中的多个包:component-scan,spring config
【发布时间】:2011-03-11 05:50:18
【问题描述】:

如何在 context:component-scan 元素的 spring-servlet.xml 文件中添加多个包?

我试过了

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

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

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

但出现错误:

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

【问题讨论】:

    标签: java spring component-scan


    【解决方案1】:

    以下做法是正确的:

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

    注意报错x.y.z.dao.daoservice.LoginDAO,上面提到的包里没有,可能是你忘记加了:

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

    【讨论】:

    【解决方案2】:

    注解方法

    @ComponentScan({ "x.y.z", "x.y.z.dao" })
    

    【讨论】:

    • 如果我们只定义顶级包,我们是否强制需要添加特定包或者它可以自动扫描子包?
    • @NikhilSahu 不,这是递归扫描(春季 3 >)
    【解决方案3】:

    您可以添加多个基础包(参见axtavt's answer),但您也可以在基础包中添加filter what's scanned

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

    【讨论】:

    【解决方案4】:
    <context:component-scan base-package="x.y.z"/>
    

    将起作用,因为其余的包是“x.y.z”的子包。因此,您无需单独提及每个包。

    【讨论】:

    • 好的!也许这是另一个原因,但这对我来说对 portlet 的 spring mvc 不起作用......
    • @elcadro 一定是因为其他原因,因为这是有据可查和宣传的功能
    • 好吧,我不能说相反,因为很多人都在纠正我。我希望我能找到为什么这对我不起作用......无论如何,谢谢!
    • 即使对于基于注释的配置也适用吗?
    【解决方案5】:

    另一种通用的Annotation方法:

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

    【讨论】:

      【解决方案6】:

      延迟响应但使用基于注释的方法提供多个包,我们可以使用如下:

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

      【讨论】:

        【解决方案7】:

        如果 x.y.z 是通用包,那么您可以使用:

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

        它将包括所有以 x.y.z 开头的包,例如: x.y.z.controller、x.y.z.service等

        【讨论】:

          【解决方案8】:

          例如,你有包“com.abc”,里面有多个包,你可以像这样使用

          @ComponentScan("com.abc")
          

          【讨论】:

            猜你喜欢
            • 2018-04-16
            • 2013-08-27
            • 1970-01-01
            • 2018-12-17
            • 1970-01-01
            • 2018-03-21
            • 1970-01-01
            • 2011-11-16
            相关资源
            最近更新 更多