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

art*_*tur 5 spring

有人可以解释一下**在弹簧配置方面的含义吗?

<context:component-scan base-package="a.b.**" />
Run Code Online (Sandbox Code Playgroud)

这有什么不同呢?

<context:component-scan base-package="a.b" />
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于在component-scan元素的base-package属性中使用通配符/ ant样式路径的信息.

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

编辑: 我根据接受的答案做了一些实验,现在知道如何将base-package属性的值"转换"为资源字符串.

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

a.b.SpringBean2
a.b.c.d.SpringBean1
Run Code Online (Sandbox Code Playgroud)

SpringBean1使用@Autowired注入SpringBean2

所以不仅如此:

<context:component-scan base-package="a.b"/>
Run Code Online (Sandbox Code Playgroud)

还有这个:

<context:component-scan base-package="a.b.**"/>
Run Code Online (Sandbox Code Playgroud)

在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*"/>
Run Code Online (Sandbox Code Playgroud)

但是,由于未解析的SpringBean2类型,这将因NoSuchBeanDefinitionException而失败:

<context:component-scan base-package="a.b.*"/>
Run Code Online (Sandbox Code Playgroud)

Bij*_*men 10

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


Ric*_*win 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>
Run Code Online (Sandbox Code Playgroud)

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

您也可以:

<context:component-scan base-package="org.*.example"/>
Run Code Online (Sandbox Code Playgroud)