@Autowire интерфейс как картавозможно? - PullRequest
5 голосов
/ 08 октября 2019

Допустим, у меня есть SomeInterface, и у меня есть два springComponentImpl, который реализует этот SomeInterface.

Я знаю, что могу автоматически связать обе реализации одновременно, с помощью:

@Autowire
private List<SomeInterface> springComponentsImplList;

Могу ли я внедрить их таким образом?:

@Autowire
private Map<String,SomeInterface> springComponentsImplList;

Таким образом, чтобы я мог получить реализацию "ключом"? Было бы идеально, если бы этот ключ был именем класса или чем-то и генерировался автоматически.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Следующее должно работать «из коробки», где карта содержит имена бинов в качестве ключей и соответствующие экземпляры бинов в качестве значений:

@Autowired
private Map<String, Foo> allBeansOfType;

Но вы также можете попытаться получить все биныэкземпляры определенного типа вместе с их именами, используя ListableBeanFactory:

private Map<String, Foo> allBeansOfType;

@Autowired
public MyClass(ListableBeanFactory beanFactory) {
    this.allBeansOfType = beanFactory.getBeansOfType(Foo.class);
}
0 голосов
/ 08 октября 2019

Вы можете добавить пружинные бобы в два отдельных List

Первый подход: Если у вас есть только каждый из них, назовите их по-разному и используйте @Qualifier

Сервисный интерфейс

public interface ServiceInterf {

}

ImplementOne

@Service("implementOne")
public class ImplementOne implements ServiceInterf {

}

ImplementTwo

@Service("implementTwo")
public class ImplementTwo implements ServiceInterf {

}

И вы можете использовать @Qualifier

@Autowired
@Qualifier("implementOne")
private List<ServiceInterf> implementOne;

@Autowired
@Qualifier("implementTwo")
private List<ServiceInterf> implementTwo;

Второй подход: Если у вас их несколько, вы можете объявить их в классе конфигурации, используя @Qualifier 5.2,Использование @Qualifier для выбора бинов

@Bean
@Qualifier("implementOne")
public ServiceInterf getServiceInterf1() {
    return new ImplementOne();
}

@Bean
@Qualifier("implementOne")
public ServiceInterf getServiceInterf2() {
    return new ImplementOne();
}

@Bean
@Qualifier("implementTwo")
public ServiceInterf getServiceInterf3() {
    return new ImplementTwo();
}

@Bean
@Qualifier("implementTwo")
public ServiceInterf getServiceInterf4() {
    return new ImplementTwo();
}

А также, если вы хотите сделать их в Map, используйте конструктор инъекций

private Map<String, List<ServiceInterf>> mapOfLists;

@Autowired
public TestMap(@Qualifier("implementOne") List<ServiceInterf> implementOne, 
               @Qualifier("implementTwo") List<ServiceInterf> implementTwo) {
    mapOfLists = Map.of("implementOne",implementOne,"implementTwo",implementTwo);  
    // Map.of is from java 9 

}
...