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;
Спасибо,
Ян.
Ответы
Ответ 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;
}
}