有人可以解释一下**在弹簧配置方面的含义吗?
<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包名称下的所有类文件.
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)
| 归档时间: |
|
| 查看次数: |
14369 次 |
| 最近记录: |