我创建了一个自定义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
的情况下有效。
有什么办法可以解决这个问题吗?
答案 0 :(得分:1)
似乎BeanFactoryAnnotationUtils
的{{3}}不支持您的情况。但是我们可以结合ApplicationContext
的{{1}}和getBeansOfType()
来达到相同的目的:
findAnnotationOnBean()