Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以要春天吗;枚举上的s@组件?_Java_Spring_Enums - Fatal编程技术网

Java 我可以要春天吗;枚举上的s@组件?

Java 我可以要春天吗;枚举上的s@组件?,java,spring,enums,Java,Spring,Enums,我正在使用Spring3.0.x,并在我的一个实现中遵循enum单例模式 public enum Person implements Nameable { INSTANCE; public String getName(){ // return name somehow (Having a variable but omitted for brevity) } } 最近我们开始通过Spring收集这些类型,所以我需要将@Component添加到我的类中

我正在使用Spring3.0.x,并在我的一个实现中遵循enum单例模式

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 
}
@Autowired
公共无效收藏品(列出全部){
//做点什么
}
执行此操作后,我观察到失败,原因是Spring无法初始化枚举类(这是可以理解的)。

我的问题是-
有没有其他方法可以将枚举类标记为bean

或者我需要更改我的实现?

如果使用Spring管理依赖项注入,则不需要使用enum单例模式。你可以把你的人换成普通班。Spring将使用默认的singleton作用域,因此所有Spring注入的对象都将获得相同的实例。

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

<util:constant static-field="...Person.INSTANCE"/>

如果您使用enum来实现一个单例,那么为什么您需要注入它呢?如果只有一个实例,为什么要将它作为列表注入呢?不仅有一个实例,还有很多实例,它们跨模块,其他人以前都是作为单例实现的,但一些开发人员选择作为enum单例模式实现(像我一样)但现在它开始失败,因为需要收集Person的所有实例。
@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;
    }
}