SeamFramework.orgCommunity Documentation

Chapitre 28. L'intégration Guice

28.1. La création d'un composant hybride Seam-Guice
28.2. La configuration d'une injection
28.3. L'utilisation de multiples injecteurs

Google Guice est une bibliothèque qui fornie une injection de dépendance légère au travers d'une résolution de type en mode sûr. L'intégration de Guice (la partie du module IoC de Seam ) permet l'utilisation de tous les composants de Seam annoté avec l'annotation @Guice. En plus de la bijection classique que Seam réalise (qui devient optionnelle), Seam délègue aussi pour savoir si les injecteurs de Guice satisfons les dependances du composant. Guice peut êtrre utile pour inclure des parties non-Seam de grande applications validées en accord avec Seam.

Note

L'intégration de Guice est livré dans la bibliothèque jboss-seam-ioc. Cette dépendance est nécéssaire pour toutes les techniques d'intégration couverte dans ce chapitre. Vous allez aussi avoir besoin du fichier JAR de Guice dans le classpath.

Le but est de créer un composant hybride Seam-Guice. La règle pour faire cela est vraiment très simple. Si vous voulez utiliser l'injection de Guice dans votre composant Seam, annoté le avec l'annotation de @Guice (après l'imporation du type org.jboss.seam.ioc.guice.Guice).

@Name("myGuicyComponent")

@Guice public class MyGuicyComponent
{
   @Inject MyObject myObject;
   @Inject @Special MyObject mySpecialObject;
   ...
}

L'injection de Guice intervient sur chaque appel de méthode tout comme avec la bijection. Guice injecte en se bassant sur le type et la correspondance. Pour satisfaire les dépencandes dans notre exemple précédent, vous devriez avoir lié ces implémentations suivante dans le module Guice, avec @Special comme annotation que vous défininissez dans votre application.

public class MyGuicyModule implements Module

{
   public void configure(Binder binder)
   {
      binder.bind(MyObject.class)
         .toInstance(new MyObject("regular"));
      binder.bind(MyObject.class).annotatedWith(Special.class)
         .toInstance(new MyObject("special"));
   }
}

Génial, mais avec l'injection de Guice qui va être utilisé pour injecter les dépendances? Et bien, vous avez besoin de réaliser quelques configurations en premier lieu.

Vous pouvez dire à Seam quel injecteur de Guice à utiliser quand il intercepte la propriété injectée du composant d'initialisation de Guice dans le descripteur de composant de Seam (components.xml):


<components xmlns="http://jboss.com/products/seam/components"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:guice="http://jboss.com/products/seam/guice"
   xsi:schemaLocation="
      http://jboss.com/products/seam/guice
      http://jboss.com/products/seam/guice-2.2.xsd
      http://jboss.com/products/seam/components
      http://jboss.com/products/seam/components-2.2.xsd">

   <guice:init injector="#{myGuiceInjector}"/>

</components
>

myGuiceInjector doit être résolue vers un composant de Seam qui implémente l'interface Injector de Guice.

Avoir à créer un injecteur est un code de type copier/coller. Quand vous voulez réellement être capable de simplement intercepter Seam vers vos modules Guice. Heureusement, il ya un composant livré de Seam qui implémente l'interface Injector pour faire exactement tout cela. Vous pouvez le configurer dans le descripteur de composant de Seam avec cette strophe additionnelle.


<guice:injector name="myGuiceInjector">
   <guice:modules
>  
      <value
>com.example.guice.GuiceModule1</value
>  
      <value
>com.example.guice.GuiceModule2</value
>  
   </guice:modules
>  
</guice:injector
>

Bien sur vous pouvez aussi utiliser un injecteur qui est déjà utilisé dans d'autres, particulièrement des parties non-Seam de votre application. Ceci est une des principales motivation de la création de cette intégration. Quand l'injecteur est définie avec une expression EL, vous pouvez obtenir par ce biais ce que vous voulez. Par exemple, vous pouvez utiliser le patron composant de fabrique de Seam pour fournir votre injecteur.

@Name("myGuiceInjectorFactory")

public InjectorFactory
{
   @Factory(name = "myGuiceInjector", scope = APPLICATION, create = true)
   public Injector getInjector()
   {
      // Your code that returns injector    
   }
}

Par défaut, un injecteur configuré dans le descripteur de composant de Seam est utilisé. Si vous avez réllement besoin d'utiliser plusieurs injecteurs (A ma connaissance vous devriez plutôt utiliser plusieurs modules), vous pouvez spécifier différents injecteurs pour chaque composant de Seam dans l'annotation @Guice.

@Name("myGuicyComponent")

@Guice("myGuiceInjector")
public class MyGuicyComponent
{
   @Inject MyObject myObject;
   ...
}

C'est tout ce qu'il y a à faire! Consultez l'exemple guice dans la distribution de Seam pour voir l'intégration de Guice de Seam en action!