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