gpt4 book ai didi

java - 注入(inject)所有带有特定注解的bean

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:51 25 4
gpt4 key购买 nike

几十年来我一直在使用 Spring,但之前从未遇到过这种用例。

有没有办法注入(inject)所有用特定注释注释的 bean,例如所有带有 @Service 的 bean 还是所有带有 @CustomAnnotation 的 bean?

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

最佳答案

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

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

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

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

由于在 @Filtervalue/classes 中指定了多个类,因此应用了 OR 逻辑。


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

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

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

另请注意,@Filter 可与 classes/value 一起使用,但不仅如此。
您确实有两种替代方法:

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

  • 重视 pattern 属性。

第一种方式希望有 type :ANNOTATIONASSIGNABLE_TYPECUSTOM
而第二种方式期望具有 type :REGEXASPECTJ

关于java - 注入(inject)所有带有特定注解的bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48592687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com