我几十年来一直在使用Spring,但之前从未涉及过这个用例。
是否有办法注入所有使用特定注释注释的bean,例如:所有使用@Service
或全部使用@CustomAnnotation
的bean?
我唯一的想法是注入上下文,得到 all bean并手动过滤。如果这是唯一的方法,那么Spring是否会公开一个递归扫描类层次结构以获取(meta)注释的方法(因为大多数Spring注释可以用作元注释)?
答案 0 :(得分:5)
@ComponentScan
注释指定includeFilters
和excludeFilters
属性
要仅扫描使用@Service
修饰的课程,您可以停用useDefaultFilters
并仅包含Service
注释:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(Service.class))
要仅扫描自定义注释,您可以编写类似的内容:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(CustomAnnotation.class))
由于value/classes
@Filter
中指定了倍数类,因此应用OR
逻辑。
请注意,@Filter
注释接受类作为value/classes
属性,但Spring会根据type
的{{1}}值解释这些属性。
默认情况下,@Filter
的值为type
要过滤特定注释(在您的情况下),此默认值适合您要在注释本身上过滤候选项。
此处FilterType枚举类中定义的值:
FilterType.ANNOTATION
另请注意public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM
}
适用于@Filter
,但不仅适用于此
你确实有两种替代方式:
评估classes/value
属性(与您的情况一样)
评估classes/value
属性。
第一种方式期望得到pattern
:type
,ANNOTATION
或ASSIGNABLE_TYPE
。
第二种方式期望为CUSTOM
:type
或REGEX
。