我使用
Spring 3.0.x并遵循我的一个实现的枚举单例模式.
public enum Person implements Nameable { INSTANCE; public String getName(){ // return name somehow (Having a variable but omitted for brevity) } }
最近我们开始通过Spring收集这些类型,所以我需要添加@Component到我的类.
@Component public enum Person implements Nameable { INSTANCE; public String getName(){ // return name somehow (Having a variable but omitted for brevity) } }
收集方式是
@Autowired public void collectNameables(List<Nameable> all){ // do something }
在这样做之后,我观察到失败,原因是Spring无法初始化枚举类(这是可以理解的).
我的问题是 –
有什么其他的方式可以将我的枚举类标记为一个bean吗?
或者我需要改变我的实现?
解决方法
如果你真的需要使用基于枚举的单例(尽管事实上Spring bean是默认的单例),你需要使用其他方式在Spring上下文中注册该bean.例如,您可以使用XML配置:
<util:constant static-field="...Person.INSTANCE"/>
或实现一个factorybean:
@Component public class PersonFactory implements factorybean<Person> { public Person getObject() throws Exception { return Person.INSTANCE; } public Class<?> getObjectType() { return Person.class; } public boolean isSingleton() { return true; } }