Могу ли я иметь @Component Spring на enum? - PullRequest
15 голосов
/ 27 апреля 2011

Я использую Spring 3.0.x и следую одноэлементному шаблону enum для одной из моих реализаций.

public enum Person implements Nameable {
    INSTANCE;

    public String getName(){
        // return name somehow (Having a variable but omitted for brevity)
    }
}

Недавно мы начали собирать эти типы через Spring, поэтому мне нужно добавить @Component в мойclass.

@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 классы как боб?Или мне нужно изменить мою реализацию?

Ответы [ 2 ]

7 голосов
/ 27 апреля 2011

Если вам действительно нужно использовать синглтон на основе перечисления (несмотря на то, что бины Spring по умолчанию являются синглетонами), вам нужно использовать другой способ регистрации этого бина в контексте 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;
    }
}
5 голосов
/ 27 апреля 2011

Вам не нужно будет использовать одноэлементный шаблон enum, если вы используете Spring для управления внедрением зависимостей.Вы можете изменить свою личность на обычный класс.Spring будет использовать область по умолчанию для singleton, поэтому все внедренные Spring-объекты получат один и тот же экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...