[JAVA] Comprendre DI

Qu'est-ce que DI

Injection de dépendance. Plutôt que de créer une instance de la classe dépendante dans la classe dépendante Avoir la classe dépendante comme variable de champ de la classe dépendante. Par conséquent, passez la classe dépendante de l'extérieur dans le constructeur, etc. Habituez-vous plutôt que de l'apprendre.

Processus DI

Il existe de nombreuses annotations liées à l'ID, mais il est facile à comprendre si vous pensez qu'elles sont essentiellement classées dans l'une des trois étapes suivantes. Quelles sont les trois étapes de l'ID?

--Définir la classe à enregistrer dans le conteneur DI

Est.

Définition de la classe à enregistrer dans le conteneur DI

--Définition Java (= JavaConfig) --Définition par annotation

Définition Java

Appelé JavaConfig. --Créez une classe avec l'annotation @Configuration --Créez une méthode avec l'annotation @Bean

@Configuration
public class AppConfiguration {

  //Inscrire la classe ServiceImpl dans le conteneur DI
  @Bean 
  public Service service() {
    return new ServiceImpl();
  }

  //Inscrire la classe RepositoryImpl dans le conteneur DI
  @Bean 
  public Repository repository()  {
    return new RepositoryImpl();
  }
  //La même chose s'applique ci-dessous
  .
  .
  .
}

Est-il normal de définir une interface et de mettre la classe d'implémentation dans @Configuration?

Définition par annotation

--Ajoutez l'annotation @Component à la classe enregistrée. --L'annotation @Component est incluse dans les définitions de diverses annotations. (-> @Controller, @Service, @Repository, @Configuration, etc.)

//@Annotation des composants@Inclus dans l'annotation de service
@Service 
public class ServiceImpl implements Service {
}

Inscription au conteneur DI

** En fait ** enregistrez l'instance dans le conteneur DI. En effectuant un ** scan de composant **, l'enregistrement de l'instance dans DI est réalisé.

Analyse des composants avec JavaConfig

-Ajoutez l'annotation @ComponentScan à la classe avec l'annotation @Configuration

@Configuration
@ComponentScan(basePackages = "jp.co.yahoo")
// @ComponentScan <-S'il est inférieur au répertoire courant
public class AppConfiguration {
}

Injection à partir du conteneur DI

Ajoutez l'annotation @Autowired. Il existe les trois méthodes suivantes.

Injection de constructeur

Ajoutez @Autowired au constructeur.

--Le champ cible peut être finalisé (= interdire le remplacement des instances dépendantes lors de l'exécution) -Vous pouvez omettre la description de @Autowired

Il y a un mérite. Méthode recommandée.

private final Service service; 
public Controller(Service service) {
  this.service = service; 
}

Injection sur le terrain

@Autowired
private Service service;

Injection de poseur

private Service service;
@Autowired
public void setService(Service service) {
  this.service = service; 
}

Seulement Dieu @SpringBootApplication

L'annotation @SpringBootApplication peut être ajoutée au démarrage de l'application. Avec cela, la plupart des annotations ci-dessus seront effectuées sans autorisation. Nous examinerons le processus ci-dessous.

référence

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes:

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Préparation 1: À propos de la configuration automatique

** SpringBoot a une classe JavaConfig prédéfinie. ** ** Si vous y réfléchissez, c'est naturel. Il ne peut pas être appelé un framework s'il est nécessaire de définir une classe cible DI à chaque fois qu'une bibliothèque externe est ajoutée et de répéter le travail d'enregistrement dans le conteneur DI.

La fonction pour enregistrer automatiquement l'instance définie dans cette classe dans le conteneur DI est appelée ** AutoConfiguration **.

Conditions enregistrées dans le conteneur DI par AutoConfiguration

** La configuration automatique peut être activée en créant une classe avec l'annotation @EnableAutoConfiguration. ** ** En général, ajoutez l'annotation @EnableAutoConfiguration à une classe qui a l'annotation @Configuration.

Préparation 2: Démarrez Spring Boot

Il y a deux points dans la création d'une classe de lancement d'application.

-Ajouter l'annotation @SpringBootApplication --Exécutez la méthode run de la classe @SpringApplication

@SpringBootAnnotation contient les annotations suivantes.

Vous pouvez également spécifier les packages à analyser à l'aide de l'attribut scanBasePackages.

@SpringBootApplication(scanBasePackages = "com.example")

Conclusion

En ajoutant l'annotation @SpringBootApplication, la définition et l'enregistrement JavaConfig par défaut dans le conteneur DI peuvent être omis.

Lors de l'enregistrement par vous-même (lors de l'ajout de la différence par rapport à JavaConfig par défaut), si vous ne définissez que par annotation, vous pouvez vous inscrire au conteneur DI simplement en ajoutant l'annotation @Component, et vous pouvez injecter avec l'annotation @Autowired. ..

Supplément

――Si la différence est trop grande, vous devrez définir JavaConfig vous-même, mais pour le moment, il n'est défini que par des annotations.

(Eh bien, je pense que vous n'avez pas besoin d'en être très conscient car la classe d'exécution est placée au niveau supérieur.)

Recommended Posts

Comprendre DI
Comprendre Docker
Comprenons la fermeture!
Comprendre le constructeur java
[Java] Spring DI ③