编程语言
首页 > 编程语言> > java – 使用特定注释注入所有bean

java – 使用特定注释注入所有bean

作者:互联网

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

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

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

解决方法:

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

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

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

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

由于在@Filter的值/类中指定了多个类,因此应用OR逻辑.

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

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

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

还要注意@Filter不仅适用于类/值,而且适用于它.
你确实有两种替代方式:

>评估classes / value属性(如您的情况)
>评估模式属性.

第一种方式期望具有类型:ANNOTATION,ASSIGNABLE_TYPE或CUSTOM.
虽然第二种方式期望具有类型:REGEX或ASPECTJ.

标签:java,spring,spring-ioc
来源: https://codeday.me/bug/20190828/1748628.html