Могу ли я использовать 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<Nameable> all){
    // do something 
}

После этого я заметил, что ошибки и причины были Spring не могут инициализировать классы enum (что понятно).

Мой вопрос -
Есть ли другой способ, который я могу отметить мои классы enum как bean?
Или мне нужно изменить мою реализацию?

Ответ 1

Если вам действительно нужно использовать синглтон на основе перечислимого типа (несмотря на то, что по умолчанию Spring beans являются синглтонами), вам нужно использовать другой способ регистрации этого bean в контексте Spring. Например, вы можете использовать конфигурацию 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 будет использовать область Singleton по умолчанию, поэтому все объекты Spring -инъекции получат один и тот же экземпляр.