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



我使用的是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)的期望,即注释的值是一个直接的常量。

有没有一种方法可以通过引用枚举中的值?

不,没有。如果annotation属性需要enum,则可以只使用enum。但是调用一个方法并不能解析为常量表达式。您可能认为可以将字段public设为直接

@Named(MY_ENUMS.A.name)

但这也不起作用,因为CCD_ 5也不是常数表达式。

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

public static final YourEnum constant = new YourEnum();

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

最新更新