2010-01-02 9 views
7

Desde Servlet 3.0 es posible registrar instancias de Servlet programáticamente con javax.servlet.ServletContext#addServlet. Esta clase también tiene un método createServlet que analiza algunas anotaciones y realiza la inyección de dependencia. Me pregunto si necesito este método si no necesito el proceso de anotación. Me gustaría tener un servlet con un constructor habitual para establecer las dependencias necesarias a través de la inyección de dependencia.¿Inyección de dependencia del constructor con Servlet 3.0?

@Inject 
public MyServlet(SomeDependency sd) { // Constructor 
    ... 
} 

Preguntas:

  • ¿Es posible construir una instancia de servlet "a mano", sin createServlet? (new MyServlet())
  • ¿Es posible utilizar el mecanismo de inyección de dependencias de un servidor Java EE para realizar la inyección del constructor? ¿Cómo hacerlo? ¿O se requiere un marco de DI separado como Guice?

Respuesta

5

El estándar Java EE 6 reciente ahora admite inyección de dependencia para servlets, la parte relevante se llama JSR-299 o CDI. La implementación de referencia JSR-299, JBoss weld, se puede implementar en contenedores servlet como Tomcat o Jetty también si no desea utilizar un servidor de aplicaciones completo de Java EE 6 como glassfish v3, p.

Por cierto, con un servidor Jetty incorporado puede usar su API personalizada para agregar instancias de servlets preconfiguradas.

+0

Gracias, JSR-299 es lo que estoy buscando. La documentación de Weld dice: "Podemos obtener una instancia de TextTranslator inyectándola en un constructor, método o campo de un bean, o un campo o método de una clase de componente Java EE como un servlet". http://docs.jboss.org/weld/reference/1.0.0/en-US/html/intro.html Parece que la inyección del constructor no es posible con los servlets. – deamon

+0

Tenga en cuenta que las primeras versiones de Weld eran bastante ... inútiles si no obtenía la configuración correcta al 100%. Esto puede haber mejorado desde entonces. –

3

Guice hace esto fuera de la caja sin la necesidad de servidores Java EE.

http://code.google.com/p/google-guice/wiki/ServletModule

+3

Guice agrega una capa encima de los servlets. Eso fue útil antes de Java EE 6. Actualmente, la inyección de dependencias es parte de Java EE y preferiría usarlo sin un marco adicional, si es posible. – deamon

Cuestiones relacionadas