是否可以使用枚举通过注释映射Spring组件?

时间:2014-04-22 23:55:27

标签: java spring dependency-injection enums

我正在使用Spring 4,我有一个枚举声明为......

public static enum MY_ENUMS {
    A(1, "enum1"),
    B(2, "enum2");

    private final int key;
    private final String name;

    MY_ENUMS(int key, String name) {
        this.key = key;
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public int getIndex() {
        return this.key;
    }
}

然后,从我的组件中我尝试做类似的事情......

// @Named is the equivalent of @Component for this use case
// Making name public and trying this also does not work:
//   @Named(MY_ENUMS.A.name)
@Named(MY_ENUMS.A.getName())
public class ServiceImplA implements IService {

    @Override
    public Object interfaceMethod() {
        // Some code specific to ServiceImplA here....
    }
}

这不构建,我知道为什么这不构建。基本上,MY_ENUMS.A.getName()对于编译器来说并不是常数,这意味着它不能在这里使用。但是枚举的意义在于它们允许您以一种有用的方式声明常量。那么,话虽如此,有没有办法通过引用枚举中的值来指定我的组件名称?

我认为这应该是可能的,因为枚举是一个特殊情况/实现常量值,但我不能想到一种方法来解决Spring(或者也许是Java)期望的价值注释是一个直线常数。

1 个答案:

答案 0 :(得分:6)

  

有没有办法可以通过参考指定我的组件名称   枚举中的值?

不,没有。如果注释属性需要enum,则可以使用enum。但是调用方法并不能解析为常量表达式。您可能认为可以创建字段public并直接访问

@Named(MY_ENUMS.A.name)

但这不起作用,因为MY_ENUMS.A.name也不是常量表达式。

theat不是常量表达式的实际原因是枚举常量基本上是变量。有一个常量变量,它是一个常量表达式。要使变量成为常量变量,它必须为final并使用常量表达式初始化。 enum常量为final,但未使用常量表达式初始化。基本上enum常量被编译为

public static final YourEnum constant = new YourEnum();

new YourEnum()表达式不是常量表达式。因此,常量不是常量变量,不能用于解析String变量,它可能是一个常量变量。