2013-09-26 1 views
4

Я использую CDI в контексте Vaadin, но это не имеет значения для моего вопроса: Как правило, лучше вводить объекты внутри конструктора или непосредственно в качестве переменной-члена? Особенно, если эти объекты должны быть дополнительно настроены для работы компонента.Инициализировать CDI впрыснутые компоненты в конструктор или пост-метод?

Далее показаны две различные возможности: КДИ

@UIScoped 
public class MyMenuBar extends CustomComponent { 
    @Inject @New private Label label; 
    @Inject @New private MenuBar menuBar; 

    @PostConstruct 
    private void init() { 
     //set label text, define menu entries 
     setCompositionRoot(menuBar); 
    } 
} 

@UIScoped 
public class MyMenuBar extends CustomComponent { 
    private Label label; 
    private MenuBar menuBar; 

    @Inject 
    public MyMenuBar(@New Label label, @New MenuBar menuBar) { 
     //set label text, define menu entries 
     setCompositionRoot(menuBar); 
    } 
} 

Есть ли лучшая практика? Почему нужно выбирать один вариант над другим? Или это вопрос личного выбора?

ответ

4

Всегда используйте @PostConstruct, когда вы работаете с инъецированными ресурсами (например, CDI и EJB), потому что только тогда вы можете быть уверены, что они действительно были введены в bean-компонент (это обеспечивается контейнером). Вот почему вы не должны полагаться на конструктор, когда дело доходит до инъекционных ресурсов (они могут быть введены, но вы не можете быть уверены).

Однако инициализация конструктора может по-прежнему быть полезной, если вы имеете дело с неинъекционными ресурсами, поэтому вы можете вызвать некоторые методы или переменные init, в этом случае это больше вопрос вкуса. Но вы никогда не ошибетесь, используя @PostConstruct все время.

6

Конструктор ТОЛЬКО для предметов строительства; т. е. НИКОГДА НЕ ЗАНЯТ БИЗНЕС-ЛОГИКУ ОТ КОНСТРУКТОРА. Allways использует @PostConstruct для логики инициализации бизнеса. См. my answer to this для более подробного объяснения.

Короче говоря, конструктор может быть вызван системой «неожиданными» способами.

Кроме того, в @PostConstruct у вас гарантированы все зависимости (поля событий).

+0

Итак, если я @Inject все объекты и прочее, которые будут использоваться в этом классе, мне, вероятно, не нужен конструктор? – membersound

+0

Я не уверен, что вы имеете в виду; я говорю, что * если * у вас есть поля '@ Inject'ed, они будут введены в метод' @ PostConstruct'. Единственными зависимостями, которые доступны в конструкторе, являются аргументы конструктора '@ Inject'ed. –

Смежные вопросы