繁体   English   中英

使用特定注释注入所有bean

[英]Inject all beans with a specific annotation

我已经使用Spring几十年了,但之前从未涉及过这个用例。

有没有办法注入所有使用特定注释注释的bean,例如所有带有@Service bean或者所有带有@CustomAnnotation

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

@ComponentScan批注指定includeFiltersexcludeFilters属性。
要仅扫描用@Service修饰的类,可以禁用useDefaultFilters并仅包含Service注释:

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

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

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

由于在@Filter value/classes类中指定了多个类,因此应用OR逻辑。


注意@Filter注释接受class(es)作为value/classes属性,但Spring会根据@Filtertype值来解释它们。
默认情况下, type具有值FilterType.ANNOTATION
要过滤特定注释(在您的情况下),此默认值适合您要在注释本身上过滤候选项。

这里在FilterType枚举类中定义的值:

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

还要注意@Filter适用于classes/value而且适用于它。
你确实有两种替代方式:

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

  • 评估pattern属性。

第一种方式期望具有typeANNOTATIONASSIGNABLE_TYPECUSTOM
虽然第二种方式期望具有typeREGEXASPECTJ

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM