在Spring中使用Enum注入Map作为值

时间:2016-09-14 13:37:16

标签: java spring dependency-injection enums

我正在研究如何在Spring中注入Map<Integer, CustomEnumType>,而不是使用app-context.xml但是使用@Bean(name = "customMap")注释。当我尝试通过

注入它时
@Inject
Map<Integer, CustomEnumType> customMap;

它抱怨,因为显然它找不到类型CustomEnumType的任何可注射依赖项。但是CustomEnumType只是一个枚举,而不是应该注入的东西。我只是想将它用作我的地图的value类型。

一种解决方案是创建一个可注入的包装器对象,它将Map作为一个字段,但我希望避免不必要的混乱。看到Map被注入的类型,它也更干净,更易读。

2 个答案:

答案 0 :(得分:0)

不要尝试注入枚举,而是尝试注入int值。

枚举确实是类,但是,您无法创建它们的实例/对象。他们的构造函数访问修饰符只能是private,这是另一个证明为什么你不能拥有它们的实例。

话虽如此,你不能拥有Enum的豆子,因为没有办法建造它们。

解决方案是给你的枚举中的每个成员一个int值,然后只注入那个int值。

例如:

public enum Color {
    white(0),
    black(1);

    private int innerValue;

    private Color(int innerValue) {
        this.innerValue = innerValue;
    }

    public int getInnerValue() {
        return innerValue;
    }
}

现在,让我们说我要注入值1,这在我的枚举中是黑色的。通过其构造函数 到另一个类 。然后我的构造函数将如下所示:

public Canvas(String id, int color) {
    this.id = id;
    this.color = Color.getColorByInt(color);
}

现在,让我们说包含此内容的xml配置文件:

<bean id="myCanvas" class="com.my.package.Canvas">
 <constructor-arg name="id" value="9876543" />
 <constructor-arg name="color" value="1" /> 
 <!-- This is the black value for myCanvas bean -->
</bean>

答案 1 :(得分:0)

我找到了解决方案。显然,@Inject@Autowired无法正确找到他们需要使用的@Bean方法的类型。但是,使用@Resource(name = "customMap")一切都很完美。即使值是枚举,地图创建也没有问题。使用的方法是:

@Bean(name = "customMap")
public Map<Integer, CustomEnumType> getCustomMap() {
  Map<Integer, CustomEnumType> map = new HashMap<>();
  map.put(1, CustomEnumType.type1);
  map.put(2, CustomEnumType.type2);
  //...
  return map;
}

并使用

注入
@Resource(name = "customMap")
Map<Integer, CustomEnumType> customMap;

请注意,CustomEnumType没有定义构造函数,也没有为枚举赋值。在我的情况下,从一开始就不可能这样做,因为CustomEnumType类是我们无法编辑的依赖项。