Spring Java Configuration - 如何创建枚举到bean-references的映射

2022-09-03 05:59:06

使用基于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>

我相信这很容易,但同样,找不到任何关于如何在纯Java中表示这一点的东西(所以我没有任何XML配置文件)。

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

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

并且颜色处理者的地图被引用为这样;

@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();
    }
}

如果需要将处理程序保留为 s,则可以将它们自动连接到配置类中:@Component

@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

由于您已经为每个ColorHandler提供了唯一的类/@Component,因此我只需让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;
    }
}

推荐