2011-04-01 12 views
12

En mi aplicación rayas que definen la clase siguiente:dependencia inyectar servlet oyente

MyServletListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { 

    private SomeService someService; 

    private AnotherService anotherService; 

    // remaining implementation omitted 
} 

La capa de servicios de esta aplicación utiliza para definir la primavera y en conjunto algunos granos de servicios de cable en un archivo XML. Me gustaría inyectar los beans que implementan SomeService y AnotherService en MyServletListener, ¿es esto posible?

Respuesta

23

Algo como esto debería funcionar:

public class MyServletListener implements ServletContextListener, HttpSessionAttributeListener, HttpSessionListener { 
    @Autowired 
    private SomeService someService;   
    @Autowired 
    private AnotherService anotherService; 

    public void contextInitialized(ServletContextEvent sce) { 
     WebApplicationContextUtils 
      .getRequiredWebApplicationContext(sce.getServletContext()) 
      .getAutowireCapableBeanFactory() 
      .autowireBean(this); 
    } 

    ... 
} 

Su oyente debe ser declarada después de ContextLoaderListener en web.xml primavera.

+2

@Don: 'contextInitalized (ServletContextEvent)' se define en [ 'ServletContextListener'] (http: //download.oracle.com/docs/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html#contextInitialized(javax.servlet.ServletContextEvent)) – ig0774

+0

¡Eso funciona genial! – Nico

+1

Importante: en web.xml ContextLoaderListener debe cargarse antes de MyServletListener. – Nico

10

Un poco más corto y más simple es usar la clase SpringBeanAutowiringSupport.
Que todo lo que tiene que hacer es esto:

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 

Así, utilizando ejemplo de axtavt:

public class MyServletListener implements ServletContextListener, HttpSessionAttributeListener, HttpSessionListener { 
    @Autowired 
    private SomeService someService;   
    @Autowired 
    private AnotherService anotherService; 

    public void contextInitialized(ServletContextEvent sce) { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 

    ... 
} 
+0

Esta es una forma mucho más simple, y funciona perfectamente. – Calabacin

Cuestiones relacionadas