gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:06:47 24 4
gpt4 key购买 nike

我创建了一个自定义的 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 中只有一个可用于注入(inject),我创建了一个 @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 时有效。

知道如何解决这个问题吗?

最佳答案

似乎来自 here , BeanFactoryAnnotationUtils 不支持你的情况。但是我们可以结合 ApplicationContextgetBeansOfType()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...");
}

关于java - Spring - 在运行时使用自定义限定符获取 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504948/

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