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 :

[Discussion] Injection de dépendance


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut [Discussion] Injection de dépendance
    Bonjour,

    J'ai récemment eu l'occasion d'utiliser l'injection de dépendance, je trouve cela pratique et ça permet d'écrire un code propre avec séparation des couches.

    Mais un détail m'a chiffonné. Il peut arriver des cas de figure où on a besoin d'effectuer des opérations dans le constructeur. Or, dans l'état actuel de l'api standard, il n'est pas possible d'injecter les dépendances avant l'appel du constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Exemple {
        @Inject
        private Dependance dependance;
     
        public Exemple() {
            // Ici la dépendance n'est pas encore injectée
        }
    }
    Pour contourner cette limitation, il est possible d'annoter un constructeur avec @Inject, et ce sont les paramètres du constructeur qui sont injectés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Exemple {
        private Dependance dependance;
     
        @Inject
        public Exemple(Dependance dependance) {
            this.dependance = dependance;
            // Ici la dépendance est injectée
        }
    }
    C'est peut-être une question de goût, mais je trouve que cette pirouette n'est pas très élégante. En plus, j'ai déjà eu l'occasion de tomber sur des cas de figures où une classe possède de nombreuses dépendances, et on se retrouve avec un constructeur avec quatre ou cinq arguments, ça commence à faire beaucoup.

    L'idée que je souhaite soumettre à discussion est celle-ci :
    Serait-il possible que la classe java.lang.Class soit modifiée (dans le cadre d'une JSR) pour fournir un meta-objet, c'est-à-dire un objet non encore initialisé ?
    Ce que je souhaiterais, c'est que les frameworks d'injection de dépendance puissent utiliser l'api standard pour injecter les dépendances avant l'appel du constructeur. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MetaObject<Exemple> meta = java.lang.Class.getMetaObject(Exemple.class);
    meta.set("dependance", new Dependance()); // Injecte la dépendance
    Exemple object = meta.init(); // Appel le constructeur
    Je ne connais pas bien le mécanisme de construction des objets. Je sais seulement qu'il se déroule en plusieurs étapes, et que, en théorie, rien n'empêche de décomposer ces étapes. Je voudrais votre avis là-dessus. Pour ceux qui sont motivés, peut-être pourrions-nous même collaborer pour soumettre une requête au JCP. Je ne connais pas bien non plus les procédures du JCP ni comment il est possible d'y participer. Je suis ouvert à toutes les bonnes volontés.

  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
    Spring propose deux solutions propres à ta questions (en plus de l'injection par paramètres)

    1) utiliser une méthode de post-init. Ce qui me semble être le plus propre:
    a) on instancie l'objet
    b) on l'injecte
    c) on l'initialise
    d) il est prêt à servir

    2) injecter dans le parent. Cela consiste à injecter entre le retour de l'appel à super() et la fin du constructeur fils. Ca nécessite que toutes les propriétés injectées soient définies dans le parent. Je trouve cette deuxième solution beaucoup plus pirouettesque et je trouve que la 1 est la plus propre en termes de POO.
    a) on appelle super()
    b) on injecte
    c) on termine le constructeur
    d) il est prêt à servir


    Pour moi ce que vous proposez est une mauvaise idée car les étapes que vous suggérez vont à l'encontre de la manière dont sont construits les objets par la JVM. Les différentes étapes sont
    1) reservation de l'espace mémoire
    2) constructeur Objet
    2* on descend dans tous les constructeurs
    Si vous vous insérer entre 1 et 2, le constructeur java aura vite fait d'effacer toute injections que vous faites (tous les champs sont systématiquement initialisés à leur valeur par défaut par le constructeur).


    edit: la JSR299 utilise @PostConstruct pour votre problème.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je ne connaissais pas @PostConstruct, mais c'est une bonne solution à mes yeux

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