Шов outjections будет удален?

Jacob Orshalick (автор Платформы Шва: Испытайте Эволюцию Java EE), сказал:

Outjection позволяет Вам делать переменные доступными от текущего контекста для инжекции или доступа через EL. Это может быть выгодно, если Вы хотите слабо связать несколько компонентов, которые вводят ту же переменную контекста (как текущий пользователь, заказываемый отель, и т.д.). Если Вы хотите избежать outjection, альтернатива должна использовать @Factory метод или устанавливать значение непосредственно в контекст через: Contexts.getConversationContext () .set ("myVarName", myVar)

Другое преимущество является производительностью. outjecting значение к контексту можно обойти необходимость пройти компонент для получения того значения. Это особенно применимо в случае таблиц данных с JSF (см. это обсуждение). Но, поскольку Вы будете видеть в обсуждении, Вы могли также использовать @BypassInterceptors для достижения того же преимущества.

Outjection является действительно удобством, но те же преимущества могут определенно быть достигнуты через другие средства. Обратите внимание, что outjection не был включен в веб-Бобы и будет или удержан от использования или полностью удален во Шве 3, таким образом, это - дальнейшая причина избежать его, если это возможно.

У нас есть приложение с большим количеством outjections, и мы начали избавляться от них. Он сказал:

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

но которые являются этими другими средствами? Как удалить outjections? В ASP.NET, например, у Вас есть переменные сеанса. Во Шве Вы можете outject var на сессии (преимущество в некоторых ситуациях).

Или объем страницы: (например, в jsf цикле отступающий боб называют многократно (иногда). У Вас есть учетная запись, которая загружается из считавшего параметрического усилителя страницы. Можно загрузить учетную запись, outject это с объемом страницы, и можно использовать его свойства значительно. ИЛИ (для предотвращения outjection) должен иметь loadAccount () метод, откуда Вы уделяете внимание дб каждый раз, когда Вам нужен он... ХУДШИЙ!)

Я не думаю что:

Contexts.getConversationContext().set("myVarName", myVar)

метод того, как избежать outjection.

Это только называет тот же контекст, где outjected переменная сохраняется и изменяет его глубоким способом (я думаю, что это точно, что @Out делают в фоновом режиме).

Вопрос 1: Что Вы думаете парни об их намерении? У Вас есть определенная информация о том, как они заменят ее?

Question2: Как Вы избегаете использования outjection?

Заранее спасибо.

5
задан Cristian Boariu 19 January 2010 в 09:57
поделиться

2 ответа

Я думаю, что лучшее, как вы можете достичь «Объемных» - это использование @Factory. Его преимущество:

  • Это может быть @ jected в другой компонент
  • , он может создать любое значение, а не просто экземпляр компонента
  • , который он рассчитывает значение один раз, и только один раз
  • может быть запущен JSF Страница (я не уверен, что вы должны включить управление транзакциями на шов, чтобы получить эту функцию)

, поэтому, если у вас есть страница JSF, которая должна получить доступ к @factory более чем один раз, он рассчитывается только один раз. Если значение должно быть рассчитано каждый раз, когда он запрашивается, поэтому вам нужен метод @unwrap. Например, встроенный компонент # {currentdate} реализуется следующим образом

@Name("org.jboss.seam.faces.facesContext")
@Scope(ScopeType.STATELESS) // ScopeType.STATELESS is similar to Spring prototype scope
public class CurrentDate {
    @Unwrap
    public Date getCurrentDate() {
        return new java.sql.Date(System.currentTimeMillis());
    }
}

С уважением

5
ответ дан 14 December 2019 в 04:38
поделиться

Во избежание прочего, просто добавьте добытку на ваше поле в вашем бобовом бобовом бону, поэтому вместо:

@Name("myBean")
public class MyBean{
    @Out
    private SomeBean someBean;

}

у вас будет:

@Name("myBean")
public class MyBean{
    private SomeBean someBean;

    public SomeBean getSomeBean(){
         return someBean;
    }
}

и в вашем файле XHTML / JSP вам придется Позвоните в Getter вместо, но у этого есть некоторые проблемы, потому что каждый раз, когда вы называете Getter, все перехватыватели шва будут применяться к этому звонку, поэтому вам, вероятно, понадобится добавить @BypassivereCeptors, чтобы предотвратить это.

И да, я также думаю, что

Contexts.getConversationContext().set("myVarName", myVar)

просто делает то, что делает доход, но вручную.

3
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: