Spring: Как заменить стандартную стратегию внедрения коллекции Spring для определенного типа - PullRequest
0 голосов
/ 19 сентября 2019

Я узнал, что в 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") и создавала прочные взаимосвязи между компонентом конфигурации и компонентом с автоматическим подключением.

Есть ли лучшее решение для достижения этой цели?

1 Ответ

0 голосов
/ 19 сентября 2019

Во-первых, область действия Spring bean по умолчанию равна singleton.

Это означает, что он создаст один экземпляр и будет доступен всем.

Таким образом, Spring не даст разрешения на изменениезначения карты с одноэлементной областью действия.

Примечание. Если вы хотите это сделать, то вы можете проверить с помощью prototype scope.Но Spring не дает вам гарантии того, что жизненный цикл боба будет сохранен.

...