На мой взгляд, существует три способа получить ссылку на другой компонент:
- Используя CDI, я могу
@Inject
именованный компонент.Это имеет тот недостаток, что CDI-аннотации плохо сочетаются с гранями-аннотациями, и поэтому я больше не могу использовать @ViewScoped
. - Использование
@ManagedProperty
кажется идеальным, за исключением того, что у меня естьввести общедоступный установщик для этого, что вредит инкапсуляции. Я могу использовать что-то вроде этого (предложено в этот ответ ):
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(
context, "#{" + beanName + "}", Object.class);
}
Я могу использовать этот метод для инициализации свойств в моем @PostConstruct
.Это не имеет ни одного из вышеперечисленных недостатков, но кажется немного сложным.Зачем мне писать вспомогательный метод для чего-то, что должен предоставить фреймворк?
Мой вопрос: какой из трех приведенных выше мне следует использовать?Кроме того, не стесняйтесь исправлять любые заблуждения, которые я мог изложить в приведенном выше описании, или предлагать другие (более изящные) методы для достижения этой цели.