【问题标题】:How to get @Qualifier from each bean of @Autowired List<> in Spring如何在Spring中从@Autowired List<>的每个bean中获取@Qualifier
【发布时间】:2019-06-08 00:42:47
【问题描述】:

有什么方法可以在 Spring 中从 @Autowired List&lt;Bean&gt; 的每个 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 列表。

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

【问题讨论】:

    标签: java spring spring-boot dependency-injection autowired


    【解决方案1】:

    要获得 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&lt;String, DataSource&gt;

    public class Repository {
    
       @Autowired
       private Map<String, DataSource> dataSources;
    
    }
    

    【讨论】:

    • 嘿,谢谢你的回答,看起来我的问题有点复杂,但你的回答是正确的。我的实际 bean 是 EntityManager,但我的配置中有 @Bean(name = "en") LocalContainerEntityManagerFactoryBean fn() 和限定符,所以当我将 @Qualifier("en") EntityManager en 提供给构造函数时,它实际上会查找 FactoryBean 名称并给我正确的 EntityManager。但是当我 @Autowired Map&lt;String, EntityManager&gt; ems; 他们没有限定符时,所以关键是 org.springframework.orm.jpa.SharedEntityManagerCreator#0
    • @varren,你的问题似乎很有趣。如果您仍然没有运气,请为它打开一个新问题,我很高兴看到它:D
    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多