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; } }