2009-08-18 13 views
13

Actualmente mis etiquetas JSP 2.0 que necesitan los granos de primavera utilizar este código:Cómo inyectar beans de primavera en un jsp 2.0 SimpleTag?

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

La acabo de recibir el primer grano de juego.

Este código funciona bien, pero tiene el inconveniente no deseado de que paso aproximadamente la mitad del tiempo de renderizado de mi página buscando frijoles primavera, ya que esto ocurre cada vez que se invoca una etiqueta. Estaba pensando en poner el frijol en el alcance de la aplicación o al menos en el alcance de la sesión. ¿Pero cuál es realmente la forma más inteligente de manejar este problema?

+0

'[http://stackoverflow.com/questions/3445908/is-there- an-elegant-way-to-injection-a-spring-managed-bean-into-a-java-custom-simpl] [1] 'tiene una buena respuesta para esto. [1]: http://stackoverflow.com/questions/3445908/is-there-an-elegant-way-to-inject-a-spring-managed-bean-into-a-java- custom-simpl – Angus

Respuesta

11

Mi primer pensamiento es, ¿estás seguro de que las llamadas a la primavera son caras? Esto está bastante optimizado, así que asegúrese de que sea un problema antes de tratar de optimizarlo.

Suponiendo que se un problema, entonces una alternativa es los exposeContextBeansAsAttributes y exposedContextBeanNames propiedades de InternalResourceViewResolver. Puede usar uno u otro (pero no ambos) para exponer algunos o todos sus beans como atributos JSP.

Esto plantea la posibilidad de inyectar Spring beans en sus clases de etiqueta. Por ejemplo, en el contexto de primavera se puede tener:

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

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

su JSP:

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

SO si MyTag define un atributo thing de tipo MyClass, el grano myBean resorte debe obtener inyectada como JSP normales atributo.

+0

Sí, son relativamente caros. Especialmente dado que las etiquetas se usan en bucles. Estamos hablando de 1 a 200 llamadas a la lógica mencionada utilizando el 60-70% de mi tiempo de ejecución. El resto del código es limpio y elegante. – krosenvold

8

Una forma más simple sería usar la anotación @Configurable en su clase de etiqueta, esto haría que Spring conecte automáticamente las dependencias cuando se inicializa la etiqueta. Todas las dependencias requeridas se pueden etiquetar con la anotación @AutoWired y Spring enlazará la dependencia incluso si la etiqueta no se inicializa dentro del contenedor de Spring.

+0

¿Podría expandir? Gracias –

5

Otra forma de lograr esto es utilizar una propiedad estática para mantener la dependencia. Al igual que a continuación:

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;  
} 
} 

En applicationContext usted, usted tiene que registrarse de manera que tanto la etiqueta JSP puede conseguir una oportunidad de ser iniciado por la primavera. Nos vamos 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> 

Enfriar eh, ahora AService es visible en nuestra etiquetas JSP :)

Cuestiones relacionadas