我可以在枚举上使用Spring的@Component吗?

我正在使用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 all){ // do something } 

执行此操作后,我观察到失败和原因是Spring无法初始化枚举类(这是可以理解的)。

我的问题是 –
有没有其他方法可以将我的枚举类标记为bean?
或者我需要改变我的实施?

如果你真的需要使用基于枚举的单例(尽管Spring bean默认是单例),你需要使用其他方法在Spring上下文中注册该bean。 例如,您可以使用XML配置:

  

或实现FactoryBean

 @Component public class PersonFactory implements FactoryBean { public Person getObject() throws Exception { return Person.INSTANCE; } public Class getObjectType() { return Person.class; } public boolean isSingleton() { return true; } } 

如果您使用Spring来管理dependency injection,则不需要使用枚举单例模式。 您可以将您的人员更改为普通class级。 Spring将使用单例的默认范围,因此所有Spring注入的对象将获得相同的实例。