有什么办法可以得到@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/