Швы изгибы будут удалены? - PullRequest
5 голосов
/ 18 января 2010

Джейкоб Оршалик (автор Seam Framework: ознакомьтесь с эволюцией Java EE) сказал:

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

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

Выпуск действительно удобен, но те же преимущества могут быть достигнуты другими способами. Обратите внимание, что исключение не было включено в Web Beans и будет либо устарело, либо полностью удалено в Seam 3, поэтому это еще одна причина избегать его, когда это возможно.

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

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

но каковы эти другие средства? Как убрать изгибы? Например, в ASP.NET у вас есть переменные сеанса. В Seam вы можете использовать var в сеансе (в некоторых ситуациях это полезно).

Или область действия страницы: (например, в цикле jsf компонент поддержки вызывается несколько раз (иногда). У вас есть учетная запись, которая загружается из параметра страницы accountId. Вы можете загрузить учетную запись, выдать ее с областью действия страницы и вы можете широко использовать его свойства. ИЛИ (чтобы избежать использования) должен иметь метод loadAccount (), где вы берете учетную запись из БД всякий раз, когда вам это нужно ... WORST!)

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

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

- это способ избежать изгнания.

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

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

Вопрос2: Как избежать использования изгнания?

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

Ответы [ 2 ]

5 голосов
/ 18 января 2010

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

  • Это может быть @ Injcted в другой компонент
  • Может создавать любое значение, а не только экземпляр компонента
  • Он вычисляет значение один раз и только один раз
  • Это может быть вызвано страницей JSF (я не уверен, нужно ли вам включить Seam Transaction Management, чтобы получить эту функцию)

Так что, если у вас есть страница 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());
    }
}

С уважением,

3 голосов
/ 25 января 2010

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

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

}

у вас будет:

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

    public SomeBean getSomeBean(){
         return someBean;
    }
}

и в вашем xhtml / jspВместо этого вы должны будете вызвать метод получения, но с этим тоже есть некоторые проблемы, потому что каждый раз, когда вы вызываете метод получения, все перехватчики шва будут применяться к этому вызову, поэтому вам, вероятно, потребуется добавить @BypassInterceptors, чтобы этого не происходило.

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

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

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

...