我正在使用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?
或者我需要改变我的实现?
答案 0 :(得分:7)
如果你真的需要使用基于枚举的单例(尽管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;
}
}
答案 1 :(得分:5)
如果您使用Spring来管理依赖注入,则不需要使用枚举单例模式。您可以将您的人员更改为普通班级。 Spring将使用单例的默认范围,因此所有Spring注入的对象都将获得相同的实例。