Как получить @Qualifier из каждого компонента @Autowired List <> в Spring - PullRequest
0 голосов
/ 14 января 2019

Есть ли способ получить имя @Qualifier от каждого компонента @Autowired List<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 Qualifier даже после autowire, и я могу просто использовать @Autowired List.

PS: это не проблема локализации, я использую все 10 дБ на одной странице

1 Ответ

0 голосов
/ 14 января 2019

Чтобы получить наиболее подробную информацию о метаданных компонента, лучше всего ввести DefaultListableBeanFactory и поиграть с его API.

Но ваш случай (т. Е. Получить карту для определенного типа бина, обозначенного его beanName) может быть просто достигнут путем введения 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;

}
...