этот шаблон JSF ломает инъекцию зависимости? - PullRequest
1 голос
/ 04 октября 2011

У меня есть проект JSF2 (Mojarra на GlassFish 3.1).

У меня есть компонент ViewScoped, который ссылается на сервисы через служебный класс, например:

@ManagedBean
@ApplicationScoped
public static class ServicesUtil {
  @EJB
  UserService userService;
  @EJB
  EmailService emailService;
  /** getters/setters **/
}

и

@ManagedBean
@ViewScoped
public class UserHandler {
  public String method() {
     ServicesUtil.getUserService().doUserStuff();
     return "newPage";
  }
}

Мой вопрос таков, поскольку ServicesUtil является ApplicationScoped, означает ли это, что для всего приложения существует только один экземпляр каждой службы? И это плохая практика? Если все сделано правильно, будет ли CDI в GlassFish создавать новые экземпляры по мере необходимости?

Точно так же, если бы Сервисы были внедрены в UserHandler, было бы приложение более масштабируемым?

Причина, по которой мы добавили слой ServicesUtil, заключается в том, что один из моих коллег сказал, что у него иногда возникали проблемы с выполнением инъекции для работы в обработчике, когда это ViewScope. Должны ли быть какие-либо трудности с использованием @EJB в bean-компоненте ViewScoped?

Любая помощь очень ценится!

Rob

1 Ответ

2 голосов
/ 04 октября 2011

Шаблон, который вы используете, кажется, не имеет большого смысла.Не должно быть проблем с внедрением EJB-компонентов в bean-объект области видимости.

В зависимости от типа используемого EJB-компонента (без сохранения состояния, с сохранением состояния или синглтоном) удерживаются разные вещи.

Если userService и emailService не имеют состояния (они, скорее всего, должны быть), вы ничего не получите, используя бин, который сначала вводится в бин области приложения.А именно, внедряется не сам бин, а прокси-сервер, и каждый запрос к нему в любом случае направляется к другому реальному экземпляру бина (см. http://en.wikipedia.org/wiki/Enterprise_JavaBean#Stateless_Session_Beans).

Если userService и emailService с состоянием, вы получаете одинпример, но я очень сомневаюсь, что вам нужно делиться фактическими данными между каждым пользователем в вашем приложении. Но даже если вы этого захотите, только один пользователь (поток) может одновременно получить доступ к бину с отслеживанием состояния.

Еслиэти сервисы одноэлементные, вы можете просто сразу внедрить их в bean-объект области видимости. Абсолютно нет причин использовать bean-объект приложения.

Кроме того, ServicesUtil.getUserService() является статическим методом, поэтому использование этогополучить внедренную услугу хрупко. Если вы хотите использовать это (не следует, но предположим), ServicesUtil следует ввести в UserHandler.

Тогда, похоже, вы путаете CDI и JSFУправляемые компоненты. Я согласен, что это сбивает с толку, но в настоящее время так оно и есть. @ViewScoped не работает в комбинации с компонентами CDI. От вашей трескиНеясно, является ли @ManagedBean вариантом JSF или вариантом Java EE / CDI.В этом случае это должно быть javax.faces.bean.ManagedBean, если вы хотите использовать область просмотра.

...