Spring Конфигурация Java - как создать карту перечислений на beans -references - программирование
Подтвердить что ты не робот

Spring Конфигурация Java - как создать карту перечислений на beans -references

с конфигурацией на основе Java, я пытаюсь преобразовать карту, которая отображает перечисления в bean ссылки в чистую конфигурацию java (в настоящее время в XML и работает), но не может найти ничего в документах;

В настоящее время мой XML выглядит так:

<util:map id="colourHanders" key-type="com.example.ColourEnum"
          value-type="com.example.ColourHandler">
    <entry key="white" value-ref="whiteColourHandler"/>
    <entry key="blue" value-ref="blueColourHandler"/>
    <entry key="red" value-ref="redColourHandler"/>
</util:map>

Я уверен, что это легко, но опять же, не могу найти ничего о том, как представить это в Pure Java (поэтому у меня нет файлов конфигурации XML).

Примечание; ColourHandler beans создаются с помощью аннотации @Component, например.

@Component
public class RedColourHandler implements ColourHander{
.....
}

и карта colorHandlers ссылается как таковая;

@Resource(name="colourHandlers")
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers;

Спасибо,

Ян.

4b9b3361

Ответ 1

Вероятно, вы хотите что-то вроде этого:

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler());
        // etc
        return map;
    }

    @Bean public ColourHandler whiteHandler() {
        return new WhiteHandler();
    }
}

Если вам нужно сохранить ваши обработчики как @Component s, вы можете их автоушилить в класс конфигурации:

@Configuration
public class MyConfiguration {
    @Autowired private WhiteColourHandler whiteColourHandler;

    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteColourHandler);
        return map;
    }
}

Ответ 2

Это на самом деле довольно просто, но вам нужно знать, как:

 @Autowired private ColourHandler whiteColourHandler;
 ...

 public Map<ColourEnum, ColourHandler> getColourHander() {
     Map<ColourEnum, ColourHandler> result = ...;
     map.put( ColourEnum.white, whiteColourHandler );
     ...
     return map;
 }

Фокус в том, что вы можете вставить beans в конфигурацию.

Ответ 3

Подобно принятому ответу, за исключением того, что вместо компонентов автосообщения вы можете объявить beans в классе конфигурации как обычно и передать их как аргументы методу Map bean:

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(ColourHandler whiteHandler) {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler);
        return map;
    }

    @Bean public ColourHandler whiteHandler() {
        return new WhiteHandler();
    }
}

Также обратите внимание, что для инъекции карты как @Resource не требуется параметр "name" аннотации, если имя поля следует за тем же самым соглашением об именах, что и определение bean.

то есть. Это будет работать без параметра name:

@Resource
private Map<ColourHandlerEnum, ColourHandler> colourHandlers;

но это потребует:

@Resource(name="colourHandlers")
private Map<ColourHandlerEnum, ColourHandler> handlers;

Ответ 4

Поскольку у вас уже есть уникальный класс /@Component для каждого ColorHandler, я просто позволю Spring выяснить, что использовать (нет необходимости в установке @Autowire или каких-либо дополнительных методах создания):

@Configuration
public class MyConfiguration {
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(
            WhiteColourHandler whiteHandler, 
            BlueColourHandler blueHandler, 
            RedColourHandler redHandler) {
        Map<ColourEnum, ColourHandler> map = new EnumMap<>();
        map.put(WHITE, whiteHandler);
        map.put(BLUE, blueHandler);
        map.put(RED, redHandler);
        return map;
    }
}