使用spring初始化java enum中的字段

时间:2014-01-25 15:56:15

标签: java spring enums

我需要在spring中初始化java enum中的“flag”字段:

public enum EntitySequenceType {
    TypeOne(-1),
    TypeTwo(-1000);
    private boolean flag;

    EntitySequenceType(long firstId){
        System.out.println("enum's constructor: "+this.name()+" firstId="+firstId);
    }

    public void setFlag(boolean val) {
        this.flag = val;
    }

    public boolean getFlag() {
        return this.flag;
    }
}

spring配置为:

<bean id="myEnum" class="com.maven.start.maven_spring.EntitySequenceType"
        factory-method="valueOf">
    <property name="flag" value="true"/>
    <constructor-arg>
        <value>TypeOne</value>
    </constructor-arg>
</bean>

但我遇到了一些问题,所以我有以下问题:

1.似乎我只能在config xml的<constructor-arg>标签中写一个值,我无法弄清楚为什么会这样。

2.当我调试代码时,我发现当spring初始化bean时,虽然我只在config xml中写了一个constructor-arg值,但构造函数被调用了两次。这怎么可能发生?

3.在EntitySequenceType的构造函数中,我发现“flag”的值为null,为什么?如果枚举实现了InitializingBean,则可以调用“afterPropertiesSet()”,但是每次构造枚举类型时都不会调用它,因此在spring设置字段后会调用任何方法,但每次都调用一个枚举类型被称为?

感谢您的回答!

2 个答案:

答案 0 :(得分:1)

问题是:

  

枚举类型的构造函数必须是包私有私有访问。它会自动创建在枚举主体开头定义的常量。你不能自己调用​​枚举构造函数。

答案 1 :(得分:1)

  

似乎我只能写一个值   在配置xml中标记,我无法弄清楚为什么会这样。

factory-method一起使用时,constructor-arg值指的是factory-method的参数列表。 EntitySequenceType.valueOf(String)只需要一个参数,String

  

当我调试代码时,我发现spring正在初始化时   bean,虽然我只写了一个构造函数-arg值   配置xml,构造函数被调用两次。这怎么可能发生?

与其他类型一样,枚举类型在代码中首次引用时会加载并初始化.class文件。 enum常量

TypeOne(-1),
TypeTwo(-1000);

实际上是编译后的字节代码中的static个字段。因此,它们在初始化类时初始化。这是两个构造函数调用,这就是你所看到的。

constructor-arg值与这些构造函数无关,它与您的factory-method有关。

  

在EntitySequenceType的构造函数中,我发现了“flag”的   值为null,为什么?如果可以调用“afterPropertiesSet()”   枚举实现InitializingBean,但不是每次都调用它   构造一个枚举类型,所以有任何方法可以调用   该字段由spring设置,但每次枚举类型时都会调用   叫?

它不能是null,它是一种原始类型。您的属性将在调用并执行factory-method后设置。无需实施InitializingBean


请勿使用enum。枚举意味着不变。