注入所有带有特定注解的bean

Inject all beans with a specific annotation

几十年来我一直在使用 Spring,但以前从未 运行 进入过这个用例。

有没有办法注入所有用特定注释注释的 bean,例如所有 @Service@CustomAnnotation?

的 bean

我唯一的想法是注入上下文,获取所有 bean 并手动过滤。如果这是唯一的方法,Spring 是否会公开一种递归扫描 class 层次结构以查找(元)注释的方法(因为大多数 Spring 注释都可以用作元注释)?

@ComponentScan 注释指定了 includeFiltersexcludeFilters 属性。
要仅扫描装饰有 @Service 的 classes,您可以禁用 useDefaultFilters 并仅包含 Service 注释:

@ComponentScan(useDefaultFilters = false,
                includeFilters = @Filter(Service.class))

要仅扫描自定义注释,您可以编写类似的东西:

@ComponentScan(useDefaultFilters = false,
                includeFilters = @Filter(CustomAnnotation.class))

由于在 @Filtervalue/classes 中指定了倍数 class,因此应用了 OR 逻辑。


请注意,@Filter 注释接受 class(es) 作为 value/classes 属性,但这些由 Spring 根据 type 的值解释@Filter.
默认情况下,type 的值为 FilterType.ANNOTATION
要过滤特定注释(如您的情况),此默认值适合您要过滤注释本身的候选者。

此处的值在 FilterType 枚举 class 中定义:

public enum FilterType {     
    ANNOTATION,    
    ASSIGNABLE_TYPE,
    ASPECTJ,
    REGEX,
    CUSTOM    
}

另请注意,@Filter 可与 classes/value 一起使用,但不仅如此。
您确实有两种替代方法:

  • 评估 classes/value 属性(如您的情况)

  • 正在评估 pattern 属性。

第一种方式需要 typeANNOTATIONASSIGNABLE_TYPECUSTOM.
而第二种方式期望有 type : REGEXASPECTJ.