使用特定注释注入所有bean

kaq*_*qao 3 java spring spring-ioc

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

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

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

dav*_*xxx 5

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

@ComponentScan(useDefaultFilters = false,
                includeFilters = @Filter(Service.class))
Run Code Online (Sandbox Code Playgroud)

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

@ComponentScan(useDefaultFilters = false,
                includeFilters = @Filter(CustomAnnotation.class))
Run Code Online (Sandbox Code Playgroud)

作为倍数类中指定 value/classes@Filter,一个OR逻辑被应用.


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

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

public enum FilterType {     
    ANNOTATION,    
    ASSIGNABLE_TYPE,
    ASPECTJ,
    REGEX,
    CUSTOM    
}
Run Code Online (Sandbox Code Playgroud)

请注意@Filter, classes/value但不仅适用于.
你确实有两种替代方式:

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

  • 评估pattern属性.

第一种方式期望有type:ANNOTATION,ASSIGNABLE_TYPECUSTOM.
而第二种方式期望具有type:REGEXASPECTJ.