[JAVA] DI: Qu'est-ce que l'injection de dépendance?

Objet de cette page

Je l'écris pour me convaincre car il n'a pas l'air juste même si je regarde diverses explications.

Aperçu DI

Tout d'abord, s'il s'agit d'un style de manuel

"DI réalise" l'inversion du principe de contrôle ", qui est l'un des modèles de conception [^ 1]". Il est possible de séparer la création d'instances constituant un composant et la résolution des dépendances du code source. (D'une introduction approfondie à Spring par NTT DATA Corporation)

Je ne sais pas de quoi tu parles. Pour le moment, pensons à un endroit facile à comprendre.

[^ 1]: Collection de savoir-faire de conception dans les langages orientés objet

Avantages de DI

Pour le moment, que faire est de côté, que peut-on améliorer par DI?

・ Dépendance réduite entre les classes = couplage lâche entre les classes (devient un couplage lâche) ・ ↑ facilite la réutilisation des classes, etc. ・ ↑ facilite les tests unitaires, etc.

Il paraît que. Il semble y avoir un noyau ici parce que le mot «dépendance» est apparu à plusieurs reprises. Alors, quelles sont les «dépendances» dans la programmation?

Qu'est-ce qu'une dépendance

Si vous utilisez des mots de manuel, "Un module change ou dépend du comportement interne d'un autre module = Si vous modifiez les spécifications d'un module dépendant, le contenu du module est susceptible d'être corrompu."

Qu'est-ce qu'une configuration qui dépend en fait fortement du langage Java, etc. -Une nouvelle instance d'une autre classe est créée dans une méthode d'une classe. -Utilisation d'une instance d'une autre classe comme argument d'une méthode d'une classe Etc. Si c'est un code concret

Hoge.java


class Hoge{
    public void hoge(){
        Fuga fuga = new Fuga();
    }
}

C'est devenu assez concret. Si vous utilisez une nouvelle classe dans une classe, et s'il y a un changement dans le constructeur de la nouvelle classe, vous pouvez imaginer que la méthode appelante doit également être modifiée. De plus, si vous modifiez la méthode dans la classe qui crée l'instance, le traitement de l'appelant sera interrompu. La solution à ce problème consiste à faire en sorte que la classe appelante utilise l'interface au lieu de créer une instance en créant une nouvelle classe d'implémentation et à faire de la nouvelle classe une classe qui hérite de l'interface. C'est.

Fuga.java


pulic interface Fuga{
    int a;
    void foo();
}

HogeFuga.java


pulic HogeFuga implements Fuga{
    int a;
    void foo(){
        fugafuga;
    };
}

Hoge.java


class Hoge{
    public void hoge(){
        Fuga fuga = new HogeFuga();
    }
}

En utilisant cette méthode, vous pouvez utiliser librement la classe qui implémente l'interface et vous pouvez réduire la dépendance. Cependant, après tout, la classe d'interface ne peut pas être nouvelle, il est donc nécessaire de décrire la sous-classe implémentée comme étant nouvelle chez l'appelant.

Par conséquent, décrivez la relation à l'aide d'un fichier xml ou d'une annotation. ↓ C'est "DI"

Méthode DI spécifique

Injection de poseur

Hoge.java


class Hoge{
    Fuga fuga;
    public void hoge(){
    }
    public void setFuga(Fuga fuga){
         this.fuga = fuga;
    }
}

À ce stade, toute classe qui implémente la classe Fuga peut être passée à la classe setFuga, et la classe Hoge ne se soucie pas de la classe réellement utilisée.

Injection d'annotation

Est-ce le courant dominant lorsque vous utilisez Spring?

Hoge.java


class Hoge{
    @Autowired
    protected Fuga fuga
    public void hoge(){
    }
}

Résumé

Qu'est-ce que DI? = Je veux réduire la liaison de la classe que j'utilise!

Recommended Posts

DI: Qu'est-ce que l'injection de dépendance?
Qu'est-ce que Cubby
Qu'est-ce qui est nul? ]
Qu'est-ce que 'java
Qu'est-ce que Keycloak
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que la façade? ??
Qu'est-ce que Java <>?
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que 'java
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que l'assemblage Maven?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'un initialiseur?
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'un opérateur?
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
Qu'est-ce que l'audit JPA?
Dagger2 - Injection de dépendance Android
[Java] Qu'est-ce que flatMap?
Qu'est-ce qu'un servlet?
Qu'est-ce que le développement Web?
[Java] Qu'est-ce que ArrayList?