【问题标题】:Inject all beans with a specific annotation注入所有带有特定注解的bean
【发布时间】:2018-02-03 00:22:05
【问题描述】:

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

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

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

【问题讨论】:

  • 它们必须被注释吗?可以注入某种类型的列表。

标签: java spring spring-ioc


【解决方案1】:

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

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

要只扫描自定义注释,你可以写一个类似的东西:

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

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


请注意,@Filter 注释接受类作为 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
而第二种方式预计具有 type : REGEXASPECTJ

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 2020-10-19
    • 2019-11-03
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2023-03-10
    相关资源
    最近更新 更多