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

Man*_*nie 14 java spring

使用基于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>
Run Code Online (Sandbox Code Playgroud)

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

注意; 在ColourHandler豆使用@Component注释,例如创建.

@Component
public class RedColourHandler implements ColourHander{
.....
}
Run Code Online (Sandbox Code Playgroud)

并且colourHandlers的地图被引用为;

@Resource(name="colourHandlers")
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers;
Run Code Online (Sandbox Code Playgroud)

谢谢,

伊恩.

her*_*ung 15

你可能想要这样的东西:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不,`whiteHandler()`将提供一个将连接到Map的单例.Spring使用cglib重写`@Configuration`类,因此源文件中的代码不是执行的代码. (2认同)
  • Spring 重写了所有@Bean 注释的方法。尝试调用 `whiteHandler()` 方法两次,你会看到你收到相同的单例实例:https://gist.github.com/4040071 (2认同)
  • 使用枚举作为键时,应始终使用EnumMap而不是HashMap.效率更高! (2认同)

ino*_*nor 6

由于您已经为每个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)