gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:56:47 27 4
gpt4 key购买 nike

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

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