2011-04-27 49 views
11

我使用Spring 3.0.x和下面我implementatons的一个枚举单件模式。我可以在枚举上使用Spring的@Component吗?

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 
} 

后这样我观察到的故障和原因是弹簧不能intialize枚举类(这是可以理解)。

我的问题是 -
是否有任何其他方式usign我可以记住我的枚举类作为一个bean?
或者我需要改变我的实现?

+0

如果您使用枚举实现一个单身,你为什么要在所有注入它,为什么如果只有一个实例,将它作为列表注入? – skaffman 2011-04-27 10:46:49

+0

不仅有一个实例,但许多,他们是跨越用于先前实施作为一个单独的模块别人,而是一些开发商选择实现的枚举单彭定康(像我一样),但现在它开始作为失败有需要收集所有Person的实例。 – Premraj 2011-04-28 06:04:18

回答

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; 
    } 
} 
5

你并不需要,如果你使用Spring管理依赖注入到使用枚举单件模式。您可以将您的人员更改为普通班级。 Spring将使用singleton的默认范围,因此所有Spring注入的对象都将获得相同的实例。

相关问题