为了账号安全,请及时绑定邮箱和手机立即绑定

Spring - 在运行时使用自定义限定符获取 bean

Spring - 在运行时使用自定义限定符获取 bean

慕田峪9158850 2022-06-04 16:29:58
我创建了一个自定义 Spring@Qualifier注释:@Target({        ElementType.FIELD,        ElementType.METHOD,        ElementType.PARAMETER,         ElementType.TYPE,        ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface Database {    String value() default "";}然后我将此注释应用于各种实现 Bean:@Repository@Database("mysql")class MySqlActionRepository implements ActionRepository {}@Repository@Database("oracle")class OracleActionRepository implements ActionRepository {}@Repository@Database("sqlserver")class SqlServerActionRepository implements ActionRepository {}现在,在运行时,只有这些 Bean 中的一个必须可用于注入,我创建了一个@PrimaryBean 方法。@Bean@PrimaryActionRepository actionRepository(        final ApplicationContext applicationContext,        final Configuration configuration) {    final var database = configuration.getString("...");    return BeanFactoryAnnotationUtils.qualifiedBeanOfType(            applicationContext,            ActionRepository.class,            database    );}但是,此解决方案不适用于我的自定义注释。它仅在使用标准时有效@Qualifier。知道如何解决这个问题吗?
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

从这里看来,BeanFactoryAnnotationUtils不支持你的情况。但是我们可以结合 ApplicationContext'sgetBeansOfType()和findAnnotationOnBean()来达到同样的目的:


@Bean

@Primary

ActionRepository actionRepository(final ApplicationContext applicationContext,

        final Configuration configuration) {

    final var database = configuration.getString("...");


    Map<String, ActionRepository> beanMap = context.getBeansOfType(ActionRepository.class);


    for (Map.Entry<String, ActionRepository> entry : beanMap.entrySet()) {

        Database db = context.findAnnotationOnBean(entry.getKey(), Database.class);

        if (db != null && db.value().equals(database)) {

            return entry.getValue();

        }

    }

    throw new RuntimeException("Cannot find the bean...");

}


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信