【问题标题】:Can I have Spring's @Component on enum?我可以在枚举上使用 Spring 的 @Component 吗?
【发布时间】:2011-04-27 10:30:00
【问题描述】:

我正在使用 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?
或者我需要改变我的实现?

【问题讨论】:

  • 如果你使用枚举来实现一个单例,为什么你需要注入它,如果只有一个实例,为什么要将它作为一个列表注入?
  • 不仅有一个实例,而且有很多实例,它们跨模块,其他人以前曾作为单例实现,但一些开发人员选择实现为枚举单例模式(如我),但现在它开始失败因为需要收集 Person 的所有实例。

标签: java spring enums


【解决方案1】:

如果你真的需要使用基于枚举的单例(尽管 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;
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-02
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多