如何从@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;
}
有没有办法从 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;
}