L’injection de dépendance avec CDI (JSR 299)

Cet article est destiné à apporter des éléments de réponses sur l’injection de dépendance avec CDI. L’implémentation de référence (développée par JBoss) sera utilisée : il s’agit de Weld.

L’injection de dépendance, souvent liée à l’inversion de contrôle, est un mécanisme permettant de réaliser des relations de dépendance dynamiquement, entre classes, en utilisant un fichier de configuration, ou bien des annotations. Avec Weld, les annotations sont utilisées afin d’indiquer les points d’injections au sein de l’application.

Weld est un framework d’injection de dépendances fortement typé. C’est à dire que les classes injectées au niveau des points d’injection vont être résolues en fonction de leur type, et non de leur nom.
Exemple :

Lors de la résolution des injections, Weld va rechercher dans ses scopes une instance de Clazz1 et de Clazz2. Si aucune instance n’existe encore, Weld va en créer une nouvelle afin de l’injecter au niveau de ces points d’injection.

Les types d’injection

Weld propose trois types d’injections :

  • Les injections par attribut :
  • Les injections par constructeur :
  • Les injections par méthode :

Les producers

Afin de pouvoir résoudre les classes à injecter, Weld a besoin de connaitre la contre-partie de ces points d’injection. Ces méthodes, ou champs, sont appelés Producers. Ils doivent être surmontés de l’annotation @Produces.

Producer par méthode :

Producer par attribut :

Nous pouvons alors réaliser l’injection suivante :

Weld sera en mesure d’associer automatiquement l’injection à son producer (résolution par Type) !

Attention : Si toutefois il existe 2 producer renvoyant le même Type d’objet, il y aura conflit d’injection. C’est à dire que Weld ne sera pas en mesure de déterminer quel producer doit être utilisé. Je vous renvoie alors vers les @Qualifier et les Alternatives, qui pourront éventuellement être l’objet d’un prochain post.
Exemple de conflit d’injection à deployment-time :

Une correction possible pourrait être , en utilisant les qualifiers :

L’annotation @Named

Cette annotation permet de rendre disponible une instance d’un bean managé à travers une EL (Expression Language), au sein d’une page JSP ou Facelets (XHTML).
Le conteneur de bean Weld surcharge le conteneur de bean JSF dans le cadre d’une utilisation conjointe de ces deux framework. Ainsi, les annotation JSF 2.0 @ManagedBean peuvent être remplacées par @Named.

Dans ce cas, le bean sera accessible via l’EL

Mais l’annotation peut également être paramétrée d’un nom à donner au bean à travers l’EL :

Dans cet autre cas, le bean sera accessible via l’EL

4 thoughts on “L’injection de dépendance avec CDI (JSR 299)

  1. Bonjour,
    Je ne suis pas (encore) très familier avec l’injection de dépendances, donc j’ai trouvé cet article très interessant, mais je me demandais quelles étaient les différences entre la jsr 299 (weld) et la 330 (guice). Il me semble que les annotations principales sont les mêmes, donc pourquoi 2 jsr ?
    Thomas

    • Salut Thomas,
      La JSR 330 est née d’une demande (de Google) de simplification de la JSR 299 (qui comprend beaucoup plus de choses que l’@Inject, comme les @Observers, les @Decorator ou les @Interceptor). On peut considérer, je pense, que la JSR 299 est composée de la JSR 330.
      L’idée de la JSR 299 est d’avoir une solution légère d’injection de dépendance, ce qui n’est pas le cas avec CDI, qui reste une grosse mécanique, mais très puissante !
      A ce sujet, je t’invite à lire cet article pour comprendre le contexte de création de la JSR 330 :)
      Si CDI t’intéresse, tu peux trouver la documentation de Weld (l’implémentation de référence) ici ;)
      N’hésite pas à visiter notre blog régulièrement, tu y trouveras des billets sur CDI que j’affectionne particulièrement :)
      Mathieu

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">