2009-08-18 24 views
13

Attualmente i miei tag jsp 2.0 che necessitano di fagioli di primavera di questo codice:Come iniettare i bean a molla in un SimpleTag jsp 2.0?

ac = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
ac.getBeansOfType(MyRequestedClass.class); 

L'ottengo solo il primo di fagioli di corrispondenza.

Questo codice funziona bene, ma presenta l'inconveniente indesiderato che trascorro circa metà del tempo di rendering della mia pagina cercando i bean primaverili, poiché ciò accade ogni volta che viene richiamato un tag. Stavo pensando di mettere il bean in ambito applicativo o almeno in ambito di sessione. Ma qual è il modo più intelligente di gestire questo problema?

+0

'[http://stackoverflow.com/questions/3445908/is-there- an-elegant-way-to-inject-a-spring-managed-bean-in-a-java-custom-simpl] [1] 'ha una buona risposta per questo. [1]: http://stackoverflow.com/questions/3445908/is-there-an-elegant-way-to-inject-a-spring-managed-bean-into-a-java- custom-simpl – Angus

risposta

11

Il mio primo pensiero è, sei sicuro che le chiamate a primavera sono costose? Questa roba è piuttosto ottimizzata, quindi assicurati che sia effettivamente un problema prima di provare a ottimizzarlo.

Supponendo che è un problema, allora alternativa è la exposeContextBeansAsAttributes e exposedContextBeanNames proprietà InternalResourceViewResolver. Puoi usare l'uno o l'altro (ma non entrambi) per esporre alcuni o tutti i tuoi bean come attributi JSP.

Ciò solleva la possibilità di iniettare effettivamente i bean Spring nelle classi di tag. Ad esempio, nel vostro contesto primavera si può avere:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="exposeContextBeansAsAttributes" value="true"/> 
</bean> 

<bean id="myBean" class="com.x.MyClass"/> 

tuo JSP:

<MyTag thing="${myBean}"/> 

SO se MyTag definisce un attributo thing di tipo MyClass, il fagiolo myBean primavera dovrebbe avere iniettato come un normale JSP attributo.

+0

Sì, sono relativamente costosi. Soprattutto perché i tag sono utilizzati nei loop. Stiamo parlando di 1-200 chiamate alla logica sopra menzionata, utilizzando il 60-70% del mio tempo di esecuzione. Il resto del codice è pulito ed elegante. – krosenvold

8

Un modo più semplice sarebbe utilizzare l'annotazione @Configurable sulla classe del tag, questo farebbe in modo che Spring colleghi automaticamente le dipendenze quando il tag viene inizializzato. Qualsiasi dipendenza richiesta può essere quindi etichettata con l'annotazione @ AutoWired e Spring collegherà la dipendenza anche se il tag non è inizializzato nel contenitore Spring.

+0

Potresti espanderti? Grazie –

5

Un altro modo per ottenere ciò è utilizzare una proprietà statica per mantenere la dipendenza. Proprio come qui di seguito:

public class InjectedTag extends SimpleTagSupport { 
//In order to hold the injected service, we have to declare it as static 
    private static AService _service; 
/***/ 
@Override 
public void doTag() throws IOException {  
      getJspContext().getOut(). 
      write("Service injected: " + _service + "<br />");  
} 
public void setService(AService service) { 
     _service = service;  
} 
} 

In te ApplicationContext, è necessario registrare entrambi in modo che il tag JSP può ottenere una possibilità di essere avviata entro la primavera. Noi andiamo con la magia ...

<bean id="aService" class="com.foo.AService"> 
    <!-- configure the service. --> 
</bean> 
<bean class="com.foo.InjectedTag" > 
    <property name="service"><ref local="aService"/></property> 
</bean> 

fredda eh, ora aservice è visibile nel nostro tag JSP :)

Problemi correlati