Spring组件扫描中base-package属性中的通配符

时间:2012-08-31 13:35:16

标签: spring

有人可以解释**在弹簧配置方面的含义是什么吗?

<context:component-scan base-package="a.b.**" />

有何不同
<context:component-scan base-package="a.b" />

我找不到在component-scan元素的base-package属性中使用通配符/ ant样式路径的任何内容。

您是否也可以向我指出任何可以解释使用的文档/源代码 组件扫描属性中的通配符?我的google-fu是没用的

修改 我根据接受的答案做了一些实验,现在知道base-package属性的值是如何“转换”为资源字符串的。

所以,我创建了两个Spring托管组件

a.b.SpringBean2
a.b.c.d.SpringBean1

SpringBean1使用@Autowired

注入SpringBean2

所以不仅如此:

<context:component-scan base-package="a.b"/>

和此:

<context:component-scan base-package="a.b.**"/>

正常工作可以正确解析SpringBean2以在SpringBean1中注入,但这些也可以工作:

<context:component-scan base-package="a.b.**.**.**"/> <!-- as many .** as you want-->
<context:component-scan base-package="a.b**"/>
<context:component-scan base-package="a.b*"/>

但由于SpringBean2类型未解析,因此NoSuchBeanDefinitionException将失败:

<context:component-scan base-package="a.b.*"/>

2 个答案:

答案 0 :(得分:10)

两者意味着相同,最终像a.b这样的基础包名称被转换为具有这种资源名称的资源查找 - classpath*:/a/b/**/*.class,您的第一个基本包名称将是这个资源类型:classpath*:/a/b/**/**/*.class,两者最终会做同样的事情,将所有类文件都放在ab包名下。

答案 1 :(得分:5)

Spring框架参考文档中描述了一种更强大的定义扫描内容和包含/排除的方法。例如,您可以这样做:

<context:component-scan base-package="org.example">
    <context:include-filter type="regex" expression=".*Stub.*Repository"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>

the spring 3.0 ref docs的第3.10.3节。

你也可以这样做:

<context:component-scan base-package="org.*.example"/>