有人可以解释**在弹簧配置方面的含义是什么吗?
<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.*"/>
答案 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"/>