IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Injection De Dépendances


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 10
    Par défaut Injection De Dépendances
    Salut,

    J'entends souvent parler d'injection de dépendance lorsque je regarde des cours sur EJB ou autre, mais je ne sais pas ce que c'est au juste ni à quoi ça peut servir. Est ce que quelqu'un pourrais me donner des exemples pour m'expliquer ça svp ?

    Merci.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ca consiste à ne pas devoir se charger d'instancier, gérer et lier tes objets entre eux. Au lieu de ça, chaque objet déclare ce dont il a besoin et un conteneur se charge de tout instancier et tout lier suivant ce qui a été demandé. C'est plus souple au niveau configuration et plus rapide à coder.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 10
    Par défaut
    Enfin, le fait d'utiliser un new pour instancier un objet n'est pas quelque chose de fastidieux pour un programmeur je crois. Sinon concrètement tu veux dire quoi par "gérer" et surtout "lier" des objets entre eux ?
    Tu as un exemple simple de code qui fait de l'injection de dépendance ?
    Au niveau des EJB, ça s'exprime par le fait que le conteneur d'EJB instancie un objet lorsque le client le demande ?

    Merci bien.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    au niveau EJB, par exemple:

    quand un EJB session a besoin d'une autre EJB session, il est préférable de faire appel à de l'injection de dépendance, plutôt que d'avoir besoin que le premier EJB aille lui même charger le JNDI, qu'il doive savoir où l'autre EJB est mappé dans le JNDI etc.

    Dans une application WEB JSF, les beans accessibles directement depuis le contexte sont gérés par JSF (vous ne faites jamais de new). Ca permet au conteneur de gérer leur cycle de vie ( requestscope, sessionscope, etc). Si un bean a besoin d'un autre, il n'y a alors que deux possibilité:
    1) mettre son nom dans le code, accéder au FacesContext, créer une EL, la faire évaluer, typecaster le résultat, on a enfin accès à l'autre bean
    2) dire à JSF d'injecter le deuxième bean dans le premier via les ManagedProperties

    Le but n'est pas d'avoir à éviter à un new. Si vous utilisez l'injection de dépendance pour ça, vous l'utilisez mal.

    Exemple de code pour utiliser un MessageBuilder se chargeant des traductions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface MessageBuilder {
        public String getMessage(String key);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MonBean {
       @Inject
       private MessageBuilder builder;
       //..... plus loin dans le code, on dois remonter le message
       throw new RuntimeException(builder.getMessage("value.toolarge"));   
    }
    A aucun moment MonBean n'a besoin de savoir quel implémentation de MessageBuilder utiliser (pas d'appel à new sur une implémentation spécifique), c'est laissé à la configuration de l'injecteur. Sans injection, ce genre de comportement, on le ferait "a la main" de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MonBean {
       private MessageBuilder builder;
       public MonBean(MessageBuilder builder){
          this.builder=builder;
       }
    et un "contrôleur" qui serait charger de faire tout et qui ressemblerait à ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       MessageBuilder builder = new DatabaseMessageBuilder(/*configuration de la DB ici qu'il faudra aussi aller chercher quelque part*/);
       MonBean b = new MonBean(builder);
    Le problème deviens encore plus flagrant quand il faut commencer à lier plusieurs classes entre elles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       MonAutreBean b2 = new MonAutreBean(builder);
       b.setMonAutreBean(b2);
       b2.setMonBean(b);
    Imaginez ça dans une projet assez important (swing ou autre) ça deviens vite l'enfer de créer les chaines de constructeurs et autre pour passer tout ce dont la petit classe qui sera déclenchée par un bouton OK aura besoin pour aller mettre à jour un DB

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    ainsi peut-on dire que les injections de dépendances vont de pair avec les annotations Java et les interfaces ?

    Et que une seule interface est utilisée pour plusieurs implémentations rattachés à celle-ci qui seront choisi de facon dynamique pour instancier la bonne implémentation ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non, tu peux faire de l'injection de dépendance avec seulement des classes, et tu peux faire de l'injection de dépendance avec uniquement un fichier de configuration.

Discussions similaires

  1. [EJB3] [JBoss] Injection de dépendance circulaire ?
    Par Claythest dans le forum Java EE
    Réponses: 6
    Dernier message: 04/08/2009, 08h11
  2. [Framework] Injection de dépendances ; comment se passer du XML ?
    Par ummon99 dans le forum Spring
    Réponses: 3
    Dernier message: 12/01/2008, 09h19
  3. [EJB3] Injection de dépendance et Stateful
    Par newbeewan dans le forum Java EE
    Réponses: 1
    Dernier message: 15/05/2007, 07h33
  4. [Integration] [EasyMock] Injection de dépendance à l'éxécution
    Par frangin2003 dans le forum Spring
    Réponses: 2
    Dernier message: 06/03/2007, 11h06
  5. Spring + TagSupport et injection de dépendance
    Par worldchampion57 dans le forum Spring Web
    Réponses: 2
    Dernier message: 26/02/2007, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo