[英]Inject all beans with a specific annotation
我已经使用Spring几十年了,但之前从未涉及过这个用例。
有没有办法注入所有使用特定注释注释的bean,例如所有带有@Service
bean或者所有带有@CustomAnnotation
?
我唯一的想法是注入上下文,获取所有 bean并手动过滤。 如果这是唯一的方法,那么Spring是否会公开一个递归扫描类层次结构以进行(元)注释的方法(因为大多数Spring注释可以用作元注释)?
@ComponentScan
批注指定includeFilters
和excludeFilters
属性。
要仅扫描用@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会根据@Filter
的type
值来解释它们。
默认情况下, type
具有值FilterType.ANNOTATION
。
要过滤特定注释(在您的情况下),此默认值适合您要在注释本身上过滤候选项。
这里在FilterType枚举类中定义的值:
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM
}
还要注意@Filter
适用于classes/value
而且适用于它。
你确实有两种替代方式:
评估classes/value
属性(如您的情况)
评估pattern
属性。
第一种方式期望具有type
: ANNOTATION
, ASSIGNABLE_TYPE
或CUSTOM
。
虽然第二种方式期望具有type
: REGEX
或ASPECTJ
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.