使用特定注释注入所有bean

时间:2018-02-03 00:22:05

标签: java spring spring-ioc

我几十年来一直在使用Spring,但之前从未涉及过这个用例。

是否有办法注入所有使用特定注释注释的bean,例如:所有使用@Service或全部使用@CustomAnnotation的bean?

我唯一的想法是注入上下文,得到 all bean并手动过滤。如果这是唯一的方法,那么Spring是否会公开一个递归扫描类层次结构以获取(meta)注释的方法(因为大多数Spring注释可以用作元注释)?

1 个答案:

答案 0 :(得分:5)

@ComponentScan注释指定includeFiltersexcludeFilters属性 要仅扫描使用@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属性。

第一种方式期望得到patterntypeANNOTATIONASSIGNABLE_TYPE
第二种方式期望为CUSTOMtypeREGEX