簡體   English   中英

春季自動連線合格的豆類

[英]Spring autowired collection of qualified beans

我有一些帶有@Qualifier批注的Spring @Components,例如在示例“ A”和“ B”中。 我想將它們(僅使用注釋)注入到List中。 我怎樣才能做到這一點 ?

@Component
public class WhatIHave {

    @Autowired
    @Qualifier("A")
    private MyType firstBean;

    @Autowired
    @Qualifier("B")
    private MyType secondBean;
    ....
}

@Component
public class WhatIWantToHave {

    @Autowired
    @Qualifier("A", "B") //something like that
    private List<MyType> beans;
    ...
}

我需要在@Configuration類中創建它嗎?

@Configuration
public class MyConfiguration {

    @Autowired
    @Qualifier("A")
    private MyType firstBean;

    @Autowired
    @Qualifier("B")
    private MyType secondBean;

    @Bean
    public List<MyType> beans() {
        return Lists.newArrayList(firstBean, secondBean);
    }
}

還是有另一種方法可以做到這一點?

@Qualifier知道在相同類型的bean情況下哪個bean可以在字段上自動裝配,所以為什么不這樣做:

@Autowired
@Qualifier("A")
private MyType firstBean;

@Autowired
@Qualifier("B")
private MyType secondBean;

然后:

List<MyType> list = new ArrayList<>();
list.add(firstBean);
list.add(secondBean);

這個解決方法如何

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class TypeCollector implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        this.applicationContext = applicationContext;
    }

    public <T> List<T> getBeans(Class<T> clazz, String... names) {
        List<T> list = new ArrayList<>();
        for (String name : names) {
            list.add(applicationContext.getBean(name, clazz));
        }
        return list;
    }
}

您可以自動連接TypeCollector並要求bean運行時。 缺點是您將在運行時獲取NoSuchBeanDefinitionException,並且必須使用Bean名稱而不是限定符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM