Решение будет использовать @Qualifier
.
@Component
@Qualifier("place1")
class Impl1OfType2 implements SomeInterface {}
@Component
@Qualifier("place1")
class Impl2OfType2 implements SomeInterface {}
@Service
class SomeClass {
@Autowired
public SomeClass(@Qualifier("place1") List<SomeInterface> interfaceList) {
System.out.println(interfaceList);
}
}
Я немного изменил имена, чтобы придерживаться соглашения Java.Они все еще немного неуклюжи и лишены контекста.
ОБНОВЛЕНИЕ
Вы можете использовать дженерики, Spring хорошо с ними справляется.Например, он будет вставлять только DogCreator
и CatCreator
в List<EntityCreator<Animal>>
.
interface Animal {}
interface Machine {}
interface EntityCreator<T> {}
@Component
class DogCreator implements EntityCreator<Animal> {}
@Component
class CatCreator implements EntityCreator<Animal> {}
@Component
class CarCreator implements EntityCreator<Machine> {}
@Component
class TruckCreator implements EntityCreator<Machine> {}
@Component
class AnimalsFactory {
@Autowired
public AnimalsFactory(List<EntityCreator<Animal>> creators) { }
}
ОБНОВЛЕНИЕ 2
Вы могли бы написать интерфейсы маркеров, которые разбили бы существующие реализации на логическиегруппы.
interface AnimalCreator {}
interface EntityCreator<T> {}
@Component
class DogCreator implements EntityCreator, AnimalCreator {}
@Component
class CatCreator implements EntityCreator, AnimalCreator {}
@Component
class AnimalsFactory {
@Autowired
public AnimalsFactory(List<AnimalCreator> creators) {
System.out.println(creators);
}
}