2010-01-02 5 views
7

Depuis Servlet 3.0, il est possible d'enregistrer des instances Servlet par programmation avec javax.servlet.ServletContext#addServlet. Cette classe a également une méthode createServlet qui analyse certaines annotations et effectue une injection de dépendances. Je me demande si j'ai besoin de cette méthode si je n'ai pas besoin du traitement d'annotation. Je voudrais avoir une servlet avec un constructeur habituel pour définir les dépendances requises via l'injection de dépendance.Injection de dépendances constructeur avec Servlet 3.0?

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

Questions:

  • Est-il possible de construire une instance de servlet "à la main" sans createServlet? (new MyServlet())
  • Est-il possible d'utiliser le mécanisme d'injection de dépendance d'un serveur Java EE pour effectuer une injection de constructeur? Comment faire? Ou est-ce qu'un cadre DI séparé comme Guice est requis?

Répondre

5

La récente norme Java EE 6 prend désormais en charge l'injection de dépendances pour les servlets, la partie correspondante s'appelle JSR-299 ou CDI. L'implémentation de référence JSR-299, JBoss weld, peut également être déployée dans des conteneurs de servlet tels que Tomcat ou Jetty si vous ne souhaitez pas utiliser un serveur d'applications Java EE 6 complet tel que glassfish v3, par exemple. À propos, avec un serveur Jetty intégré, vous pouvez utiliser son API personnalisée pour ajouter des instances de servlet préconfigurées.

+0

Merci, JSR-299 est ce que je cherche. La documentation de Weld indique: "Nous pouvons obtenir une instance de TextTranslator en l'injectant dans un constructeur, une méthode ou un champ d'un bean, ou un champ ou une méthode d'une classe de composant Java EE telle qu'une servlet." http://docs.jboss.org/weld/reference/1.0.0/fr-FR/html/intro.html Il semble que l'injection du constructeur n'est pas possible avec les servlets. – deamon

+0

Notez que les premières versions de Weld étaient plutôt ... inutiles si vous n'aviez pas la configuration 100% correcte. Cela peut avoir amélioré depuis. –

3

Guice fait cela sans avoir besoin de serveurs Java EE.

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

+3

Guice ajoute une couche au-dessus des servlets. C'était utile avant Java EE 6. Aujourd'hui, l'injection de dépendance fait partie de Java EE et je préférerais l'utiliser sans cadre supplémentaire - si possible. – deamon

Questions connexes