java - Spring中如何从@Autowired List<>的每个bean中获取@Qualifier

标签 java spring spring-boot dependency-injection autowired

有什么办法可以得到@Qualifier @Autowired List<Bean> 的每个 bean 的名称在 Spring 。或者更广泛地说:我可以获得一颗 bean @Qualifier如果我有一个 bean 实例,那么运行时会提供信息?

假设我有:

//Config.java
@Bean(name = "en-db")
@ConfigurationProperties(prefix = "spring.datasource.en")
public DataSource dataSourceEN() {...}

@Bean(name = "de-db")
@ConfigurationProperties(prefix = "spring.datasource.de")
public DataSource dataSourceDE() {...}

//Repository.java
public Repository(List<DataSource> ds) { 
    // Is there any way to create a hashmap of Qualifier => Bean? 
    // like {"en-db" : ds.get(0), "de-db" : ds.get(1)}
    // or maybe there is a way to autowire the Hashmap<Qualifier, Bean>
}

现在我正在使用这个(并且效果很好):

public Repository(@Qualifier("en-db") DataSource en, 
                  @Qualifier("de-db") DataSource de, //... and many more  
){ 
   Map<String, EntityManager> dataSources = new HashMap<>();
   dataSources.put("en-db", en);
   dataSources.put("de-db", de);
   ...

}

但是我有 10 多个数据源,感觉即使在 Autowiring 之后也应该有某种方法来检测 Bean 限定符,我可以只使用 @Autowired List。

PS:这不是本地化问题,我在单个页面上使用了所有 10 db

最佳答案

要获取 bean 最详细的元数据信息,最好的选择是注入(inject) DefaultListableBeanFactory并使用它的 API 。

但是你的情况(即获取由 beanName 键控的某种类型的 bean 的映射)可以通过注入(inject) ApplicationContext 来简单地实现并称之为 getBeansOfType :

@Autowired
public Repository(ApplicationContext ctx) { 
   //The key is the beanName which is en-db , de-db .....  
   Map<String, DataSource> map = ctx.getBeansOfType(DataSource.class);
}

或者更好的是注入(inject) Map<String, DataSource> :

public class Repository {

   @Autowired
   private Map<String, DataSource> dataSources;

}

关于java - Spring中如何从@Autowired List<>的每个bean中获取@Qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54174541/

相关文章:

java - 使用 Spring 的通知机制

spring - 在 Spring Boot 中设计可定制的 ERP

java - Spring neo4j 启动/停止长时间运行的进程的最佳位置 [Java]

mongodb - 嵌入式 MongoDB 尝试下载 Zip

java - 我如何转换 xsd : pattern in java regex

java - 接口(interface)是如何调用的?

java - 确保 JVM 不优化

spring - 加载 spring bean 时,如果我有一个构造函数和 setter,将首先调用哪个?

java - 如何从 spring-boot-starter-parent 中排除特定的依赖项

java - 添加新元素后,JSVGCanvas 不更新图形