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

How to get @Qualifier from each bean of @Autowired List<> in Spring

有没有办法从 Spring 中 @Autowired List<Bean> 的每个 bean 中获取 @Qualifier 名称。或者更广泛地说:如果我有一个 bean 实例,我可以在运行时获取 Bean @Qualifier 信息吗?

假设我有:

//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 多个数据源,我觉得即使在自动装配之后也应该有某种方法来检测 Bean 限定符,我可以只使用@Autowired List。

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

要获得 bean 的最详细的元数据信息,最好的办法是注入 DefaultListableBeanFactory 并使用它的 API。

但是您的情况(即获取由其 beanName 键入的某种类型的 bean 的映射)可以通过注入 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);
}

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

public class Repository {

   @Autowired
   private Map<String, DataSource> dataSources;

}