我可以在枚举上获得Spring的@Component吗?

2022-09-02 13:47:35

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


答案 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 来管理依赖关系注入,则不需要使用枚举单例模式。您可以将“个人”更改为普通类。Spring 将使用单例的默认范围,因此所有 Spring 注入的对象都将获得相同的实例。