当前位置: 首页 > 知识库问答 >
问题:

使用特定注释注入所有bean

李捷
2023-03-14

我已经使用Spring几十年了,但以前从未遇到过这个用例。

是否有方法注入所有带特定注释的bean,例如,所有带服务的bean或所有带自定义注释的bean?

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

共有1个答案

李谦
2023-03-14

组件扫描注释指定了包含过滤器(includeFilters)和排除过滤器(excludeFilters)属性
若要仅扫描由服务修饰的类,可以禁用使用默认过滤器,并仅包括服务注释:

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

要仅扫描自定义注释,可以编写类似的内容:

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

由于在过滤器的值/类中指定了多个类,因此应用了逻辑。

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

此处为FilterType枚举类中定义的值:

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

另请注意,@Filter适用于类/值,但不仅仅如此。
您确实有两种替代方法:

>

  • 评估类/值属性(如您的情况)

    模式属性进行赋值

    第一种方式希望具有as类型、可分配类型或自定义类型
    而第二种方法希望具有as类型:REGEXASPECTJ

  •  类似资料:
    • 问题内容: 我想用指定的注释(例如@Monitor)监视所有类的所有公共方法(注意:注释在类级别)。可能的切入点是什么?注意:我正在使用@AspectJ样式的Spring AOP。 问题答案: 你应该将类​​型切入点与方法切入点结合使用。 这些切入点将在标记为@Monitor的类中查找所有公共方法: 为结合了前两者的最后一个切入点提供建议,你就完成了!

    • 我有一个pb,我找不到解决方案,因为我认为我的项目中有多个pb相关: 有人能帮我吗?我可以给你链接到git存储库,也可以看到所有的项目。谢谢。

    • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?

    • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!

    • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

    • 我有一把刀: 问题是,当我试图使用DAO进行加载调用时,使用DynamoDBMapper以field d1作为哈希键来获取项目,它会抛出一个DynamoDBExc0019,说:为公共DAO. getField2()找到了空键,但实际上表的值对应于field d2。问题,这是因为Lombok注释而不是手动突变代码,还是一般来说我们一起使用Lombok和DynamoDBAnnotions?