Я узнал, что в Spring я могу автоматически подключать / вставлять в карту по имени:
public interface DummyInterface{
String getName();
}
@Component
public class Impl1 implement DummyInterface{
@Override
public String getName(){
return "implOne";
}
}
@Component
public class Impl2 implement DummyInterface{
@Override
public String getName(){
return "implOne";
}
}
public class SomeUsage{
@Autowired
private Map<String, DummyInterface> mapping;
// ...
}
Однако я хочу заменить ключ ввода по умолчанию, используя DummyInterface::getName
result в качестве ключа.Итак, я попытался написать @Configuration
класс, как показано ниже:
@Configuration
public class AlgorithmBeanConfig {
@Autowired
private List<DummyInterface> sourceScoreRules;
@Bean
public Map<String, DummyInterface> getScoreRulesMappedByName(){
return sourceScoreRules.stream().collect(
Collectors.toMap(DummyInterface::getName, Function.identity()));
}
}
Но это не удалось.Когда я проверил это поле @Autowired
, его ключи содержат те же значения по умолчанию.
Я знаю, что существует решение, которое всегда внедряет коллекцию по имени, например:
// use place
@Resource(name = "myBean")
private Map<String, DummyInterface> collection;
// configuration class
@Bean(name = "myBean")
public Map<String, DummyInterface> getScoreRulesMappedByName(){
return sourceScoreRules.stream().collect(
Collectors.toMap(DummyInterface::getName, Function.identity()));
}
Нонеобходимо, чтобы коллекция постоянно аннотировалась с помощью @Resource(name = "someName")
и создавала прочные взаимосвязи между компонентом конфигурации и компонентом с автоматическим подключением.
Есть ли лучшее решение для достижения этой цели?