我需要在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设置字段后会调用任何方法,但每次都调用一个枚举类型被称为?
感谢您的回答!
答案 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
。枚举意味着不变。