7
votes

Comment la dépendance est-elle mise en œuvre manuellement?

Comment nous pouvons injecter manuellement un objet sans utiliser l'installation de conteneurs. J'ai fait quelque chose de similaire à la réflexion comme suit.

Class actionClass = Class.forName("SampleClass");
Object actionObject = actionClass.newInstance();
Method reqMethod = actionClass.getMethod("setRequest", HttpServletRequest.class);
reqMethod.invoke(actionObject,request);


0 commentaires

5 Réponses :


0
votes

L'injection de dépendance implique que vous obtenez des références correctement initialisées apparaissant "par magie".

Vous appelez la méthode SETReQuest () avec l'objet de la demande, mais DI permet également de définir les champs sans invoquer des méthodes.

Guice n'est pas en tant que telle nécessite un conteneur, mais utilise la magie de chargeur de classe démarrée dans la méthode principale. Cela seraient-ils utilisables pour vous?


5 commentaires

J'aime le terme "par magie". Comment l'initialisation se passe-t-elle. Comment cela se fait au printemps ou à des conteneurs similaires.


L'idée est de déplacer l'initialisation de la classe injectée et de la classe L'injection se produit, de sorte qu'ils ne savent pas comment cela se produit. Lorsque vous déplacez ensuite le code d'injection, la mise en œuvre dépend de la mise en œuvre et vous n'a pas besoin de savoir. En fin de compte, la réflexion est utilisée mais c'est tout comme dire que Hibernate utilise JDBC à la fin.


Mon intention est de passer de la demande d'objet à différentes classes de contrôleur dynamiquement à partir d'un filtre Dispatcher, où nous obtenons des objets de demande et de réponse.


En utilisant une réflexion, je crains de la performance.Si le printemps fait de la même manière, alors non je ferai la même chose.


La réflexion est la seule façon. En cas de doute sur la performance, mesurer.



6
votes

L'injection de dépendance n'est rien de plus que de fournir une classe avec ses dépendances, plutôt que de les trouver elle-même (via des singletons / recherches, etc.). Donc, vous pouvez le faire en code de manière triviale ainsi: xxx

(pseudocode). Ici, le mydao est en train d'être injecté avec une connexion de base de données. Si cette connexion de base de données implémente une interface, vous pouvez facilement se moquer de cela pendant les tests.


0 commentaires

2
votes

Eh bien, lorsque vous définissez un objet dans un autre objet à l'aide de la méthode Setter ou via un constructeur, il s'agit également de l'injection de dépendance. L'injection de dépendance signifie uniquement créer une relation (dépendance) dans des objets.

Utiliser la réflexion Comme vous l'avez fait en est une autre forme.


0 commentaires

1
votes

Pourquoi utiliseriez-vous une réflexion? Pourquoi pas simplement: xxx

qui fait la même chose, mais est plus lisible, permet au compilateur de vérifier que les types et les méthodes existent réellement, vous fournit Javadoc pour la méthode invoquée, active votre IDE pour aider dans les refacteurs, ...

et il est toujours une injection de dépendance, car l'action ne va pas chercher sa demande, mais reçoit la demande lors de l'initialisation.

< Strong> Modifier : Thorbjã¸rn demandé je montre comment cette action serait utilisée. Il serait lui-même injecté (à l'aide d'un seigteur) dans la composante utilise l'action. Le composant utiliserait ensuite l'objet d'action injecté. xxx

si servlet est destiné à vivre plus longtemps que action , à savoir Il devrait utiliser une nouvelle action à chaque fois qu'il en a besoin d'une seule, on peut plutôt injecter un fichier Actionfactory dans servlet .

Dans ce cas concret, j'aurais interrogé que l'action doit vraiment tenir une demande dans le cadre de son état ou peut être immuable et agir simplement sur la demande adoptée par le servlet en tant que paramètre de méthode. Dans ce cas, l'initialisation du temps de démarrage ferait: xxx

et actionbasedSerservlet définirait xxx


4 commentaires

Le mot clé nouveau donne une liaison extrêmement forte de la classe actuelle à celle nouvelle. Injection de dépendance découle cette forte liaison entre les deux.


L'injection de dépendance découle le composant de ses dépendances. Cela ne signifie pas qu'il ne faut pas y avoir une autre partie du code connaissant à la fois le composant et sa dépendance. Sampleclass n'est pas couplé à la demande particulière de mon exemple.


Dans mon cas, le nom de classe est dynamique.Pour faire un di pour toutes les classes. C'est pourquoi j'ai utilisé la réflexion. Merci pour votre réponse.


@meriton, dans ce cas, veuillez ajouter le code supplémentaire indiquant comment utiliser l'objet action.



0
votes

Le cadre de printemps est l'une des implémentations les plus populaires. C'est aussi opensource. Vous pouvez consulter la classe org.springframeowrk.beans.beanutils, en particulier les méthodes CopyProperties (tous les 4 d'entre eux) pour des exemples sur la façon de faire cela. Pour plus d'informations, vous pouvez également voir la hiérarchie de la classe d'org.springframework.beans.Factory.Beanfactory pour différentes stratégies.


0 commentaires