【问题标题】:multiple packages in context:component-scan, spring config上下文中的多个包:组件扫描,弹簧配置
【发布时间】:2011-07-13 06:30:03
【问题描述】:

如何在 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】:

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

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

    【讨论】:

      【解决方案2】:

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

      @ComponentScan("com.abc")
      

      【讨论】:

        【解决方案3】:

        另一种通用的Annotation方法:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            您可以添加多个基础包(参见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>
            

            【讨论】:

            【解决方案6】:

            注解方法

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

            【讨论】:

            • 如果我们只定义顶级包,我们是否强制需要添加特定包或者它可以自动扫描子包?
            • @NikhilSahu 不,这是递归扫描(春季 3 >)
            【解决方案7】:
            <context:component-scan base-package="x.y.z"/>
            

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

            【讨论】:

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

            以下做法是正确的:

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

            【讨论】:

            猜你喜欢
            • 2012-09-07
            • 2018-11-27
            • 1970-01-01
            • 2017-09-02
            • 2015-11-03
            • 1970-01-01
            • 2015-01-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多