2010-01-18 6 views
5

Jacob Orshalick (autore di Seam Framework: Sperimentare l'evoluzione di Java EE) ha detto:Le espulsioni dei giunti saranno rimosse?

dell'outjection consente di effettuare variabili disponibili dal contesto attuale per l'iniezione o l'accesso attraverso EL. Questo può essere utile se si desidera accoppiare liberamente diversi componenti che iniettano la stessa variabile di contesto (come l'utente corrente, l'hotel prenotato, ecc.). Se si desidera evitare l'espulsione, un'alternativa è utilizzare un metodo @Factory o impostare il valore direttamente nel contesto tramite: Contexts.getConversationContext(). Set ("myVarName", myVar)

Un altro vantaggio è la prestazione. Escludendo un valore nel contesto, è possibile evitare di dover passare attraverso il componente per ottenere quel valore. Questo è particolarmente applicabile nel caso di tabelle di dati con JSF (vedi questa discussione). Ma, come vedrai nella discussione, potresti utilizzare @BypassInterceptors per ottenere lo stesso vantaggio.

L'espulsione è davvero una comodità, ma gli stessi vantaggi possono sicuramente essere raggiunti con altri mezzi. Nota che l'espulsione non è stata inclusa in Web Beans e sarà deprecata o completamente rimossa in Seam 3, quindi questo è un ulteriore motivo per evitarlo quando possibile.

Abbiamo un'applicazione con un sacco di outjections e abbiamo cominciato a sbarazzarsi di loro. Ha detto:

ma gli stessi vantaggi possono sicuramente essere raggiunti con altri mezzi.

ma quali sono questi altri mezzi? Come rimuovere le espulsioni? Ad esempio, in ASP.NET ci sono variabili di sessione. In Seam, puoi escludere var in sessione (un vantaggio in alcune situazioni).

Oppure pagina portata: (per esempio nel ciclo jsf bean supporto viene chiamato più volte (talvolta) Hai un conto che è caricato da una pagina accountid param È possibile caricare il conto, outject con una portata pagina.. e (per evitare l'espulsione) è necessario avere un metodo loadAccount() dove si prende l'account dal db ogni volta che ne avete bisogno ... PEGGIO!)

Non penso che:

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

è un metodo per evitare l'espulsione.

Questo chiama solo lo stesso contesto in cui la variabile espulsa viene salvata e la modifica in modo profondo (penso che sia esattamente ciò che @Out fa in background).

Domanda 1: Cosa ne pensi ragazzi della loro intenzione? Avete informazioni specifiche su come lo sostituiranno?

Domanda 2: Come si evita l'uso dell'espulsione?

Grazie in anticipo.

risposta

5

Penso che il modo migliore per ottenere "l'espulsione" sia usando @Factory.Il suo vantaggio:

  • Può essere @ A-proiettata in un altro componente
  • Può crea alcun valore, non solo un'istanza di componente
  • E 'calcolare il valore una volta, e solo una volta
  • Può essere innescato da pagina JSF (io non sono sicuro se è necessario attivare Seam Transaction Management al fine di ottenere questa funzione)

Quindi, se si dispone di una pagina JSF che ha bisogno di accedere a una @Factory più di una volta, E ' calcolato solo onc e. Se un valore deve essere calcolato ogni volta che viene richiesto, quindi è necessario un metodo @Unwrap. Per esempio, # {currentDate} incorporato componente è implementato come segue

@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()); 
    } 
} 

saluti,

3

Per evitare dell'outjection basta aggiungere un getter al vostro campo nel backing bean, così invece di:

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

} 

si avrà:

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

    public SomeBean getSomeBean(){ 
     return someBean; 
    } 
} 

e nel vostro xhtml/file JSP si dovrà chiama invece il getter, ma anche questo ha alcuni problemi, perché ogni volta che chiami il getter tutti gli Interceptor di Seam verranno applicati a quella chiamata, quindi probabilmente dovrai aggiungere @BypassInterceptors per evitare che ciò accada.

E sì penso anche che

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

è solo facendo quello che fa fare l'outject ma manualmente.

+0

ciao, puoi dirmi come raggiungere il basso in cucitura 3 ?? Contexts.getConversationContext(). Set ("myVarName", myVar) –

Problemi correlati