5

有人可以解释一下 ** 在 spring 配置的上下文中代表什么吗?

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

以及这与

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

我找不到任何关于在组件扫描元素的基本包属性中使用通配符/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.*"/>
4

2 回答 2

11

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

于 2012-08-31T13:47:48.220 回答
6

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>

请参阅spring 3.0 参考文档的第 3.10.3 节。

你也可以这样做:

<context:component-scan base-package="org.*.example"/>
于 2012-08-31T14:50:25.823 回答