注入所有带有特定注解的bean
Inject all beans with a specific annotation
几十年来我一直在使用 Spring,但以前从未 运行 进入过这个用例。
有没有办法注入所有用特定注释注释的 bean,例如所有 @Service
或 @CustomAnnotation
?
的 bean
我唯一的想法是注入上下文,获取所有 bean 并手动过滤。如果这是唯一的方法,Spring 是否会公开一种递归扫描 class 层次结构以查找(元)注释的方法(因为大多数 Spring 注释都可以用作元注释)?
@ComponentScan
注释指定了 includeFilters
和 excludeFilters
属性。
要仅扫描装饰有 @Service
的 classes,您可以禁用 useDefaultFilters
并仅包含 Service
注释:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(Service.class))
要仅扫描自定义注释,您可以编写类似的东西:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(CustomAnnotation.class))
由于在 @Filter
的 value/classes
中指定了倍数 class,因此应用了 OR
逻辑。
请注意,@Filter
注释接受 class(es) 作为 value/classes
属性,但这些由 Spring 根据 type
的值解释@Filter
.
默认情况下,type
的值为 FilterType.ANNOTATION
。
要过滤特定注释(如您的情况),此默认值适合您要过滤注释本身的候选者。
此处的值在 FilterType 枚举 class 中定义:
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM
}
另请注意,@Filter
可与 classes/value
一起使用,但不仅如此。
您确实有两种替代方法:
评估 classes/value
属性(如您的情况)
正在评估 pattern
属性。
第一种方式需要 type
:ANNOTATION
、ASSIGNABLE_TYPE
或 CUSTOM
.
而第二种方式期望有 type
: REGEX
或 ASPECTJ
.
几十年来我一直在使用 Spring,但以前从未 运行 进入过这个用例。
有没有办法注入所有用特定注释注释的 bean,例如所有 @Service
或 @CustomAnnotation
?
我唯一的想法是注入上下文,获取所有 bean 并手动过滤。如果这是唯一的方法,Spring 是否会公开一种递归扫描 class 层次结构以查找(元)注释的方法(因为大多数 Spring 注释都可以用作元注释)?
@ComponentScan
注释指定了 includeFilters
和 excludeFilters
属性。
要仅扫描装饰有 @Service
的 classes,您可以禁用 useDefaultFilters
并仅包含 Service
注释:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(Service.class))
要仅扫描自定义注释,您可以编写类似的东西:
@ComponentScan(useDefaultFilters = false,
includeFilters = @Filter(CustomAnnotation.class))
由于在 @Filter
的 value/classes
中指定了倍数 class,因此应用了 OR
逻辑。
请注意,@Filter
注释接受 class(es) 作为 value/classes
属性,但这些由 Spring 根据 type
的值解释@Filter
.
默认情况下,type
的值为 FilterType.ANNOTATION
。
要过滤特定注释(如您的情况),此默认值适合您要过滤注释本身的候选者。
此处的值在 FilterType 枚举 class 中定义:
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM
}
另请注意,@Filter
可与 classes/value
一起使用,但不仅如此。
您确实有两种替代方法:
评估
classes/value
属性(如您的情况)正在评估
pattern
属性。
第一种方式需要 type
:ANNOTATION
、ASSIGNABLE_TYPE
或 CUSTOM
.
而第二种方式期望有 type
: REGEX
或 ASPECTJ
.