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

时间:2019-02-03 16:22:22

标签: java spring

我创建了一个自定义Spring @Qualifier批注:

@Target({
        ElementType.FIELD,
        ElementType.METHOD,
        ElementType.PARAMETER, 
        ElementType.TYPE,
        ElementType.ANNOTATION_TYPE
})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @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中的一个必须可用于注入,所以我创建了一个@Primary Bean方法。

@Bean
@Primary
ActionRepository actionRepository(
        final ApplicationContext applicationContext,
        final Configuration configuration) {
    final var database = configuration.getString("...");
    return BeanFactoryAnnotationUtils.qualifiedBeanOfType(
            applicationContext,
            ActionRepository.class,
            database
    );
}

但是,此解决方案不适用于我的自定义注释。仅在使用标准@Qualifier的情况下有效。

有什么办法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

似乎BeanFactoryAnnotationUtils的{​​{3}}不支持您的情况。但是我们可以结合ApplicationContext的{​​{1}}和getBeansOfType()来达到相同的目的:

findAnnotationOnBean()