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 :
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 public class Exemple { @Inject private Dependance dependance; public Exemple() { // Ici la dépendance n'est pas encore 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.
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 } }
L'idée que je souhaite soumettre à discussion est celle-ci :
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 :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é ?
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.
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
Partager