Spring Java Configuration – 如何为bean-references创建枚举映射

使用基于Java的配置,我试图将枚举映射到bean引用的映射转换为纯java配置(目前在XML和工作中),但似乎无法在文档中找到任何内容;

目前,我的XML就是这样;

     

我确信这很容易但是再一次,在Pure Java中找不到关于如何表示这一点的任何内容(所以我没有任何XML配置文件)。

注意; ColourHandler bean是使用@Component注释创建的,例如。

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

并且colourHandlers的地图被引用为;

 @Resource(name="colourHandlers") private Map colourHandlers; 

谢谢,

伊恩。

你可能想要这样的东西:

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

如果需要将处理程序保存为@Component ,则可以将它们自动装入配置类:

 @Configuration public class MyConfiguration { @Autowired private WhiteColourHandler whiteColourHandler; @Bean public Map colourHandlers() { Map map = new EnumMap<>(); map.put(WHITE, whiteColourHandler); return map; } } 

这实际上非常简单,但您需要知道如何:

  @Autowired private ColourHandler whiteColourHandler; ... public Map getColourHander() { Map result = ...; map.put( ColourEnum.white, whiteColourHandler ); ... return map; } 

诀窍是你可以将bean注入配置中。

类似于接受的答案,除了可以像往常一样在配置类中声明bean而不是自动assembly组件,并将它们作为参数传递给Map bean方法:

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

另请注意,如果字段名称遵循与bean定义相同的命名约定,则将映射作为@Resource注入不需要注释的“name”参数。

ie这将没有名称参数:

 @Resource private Map colourHandlers; 

但这需要它:

 @Resource(name="colourHandlers") private Map handlers; 

由于每个ColorHandler都有一个唯一的类/ @Component,我只想让Spring弄清楚要使用什么(不需要@Autowire注入或任何其他创建方法):

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