web-dev-qa-db-fra.com

Architecture de code de l'interface de service et des classes d'implément de service

J'ai découvert que dans un modèle MVC, il y a principalement 4 classes; le contrôleur, le service, le service impl et repo. 

Le service est une interface et le service impl implémente la classe de service et contient tous les codes logiques. La structure serait quelque chose comme: -

Service classe d'interface

Service{

public void someMethod();

}

ServiceImpl classe

 ServiceImpl implements Service{
  public void someMethod(){
   //do something

   }    
 }

Mais lorsque nous voulons accéder aux codes d'implication de service à partir du contrôleur, nous appelons la méthode de classe de service comme suit: -

@Autowired 
Service service;

Object obj =  service.someMethod();

Comment le contrôleur exécute-t-il le code de la classe ServiceImpl

9
viper

Voici comment fonctionne le printemps:

L'implémentation du service doit être un bean Spring (elle doit avoir une annotation @Component ou @Service ou doit être définie dans un fichier de configuration XML Spring), de sorte que Spring le trouve et l'enregistre dans le contexte de l'application Spring.

Ensuite, vous utilisez l'injection de dépendance, via l'annotation @Autowired, pour injecter l'implémentation du service dans le contrôleur. Cela signifie que Spring examinera votre contrôleur, trouvera l'annotation @Autowired sur la variable membre service et l'initialisera avec un bean trouvé dans le contexte de l'application, qui sera l'instance de la classe d'implémentation de service précédemment enregistrée. . Donc, une fois que Spring est terminé, service fera référence à l'instance de ServiceImpl.

Consultez la documentation de référence de Spring Framework pour plus d'informations sur le fonctionnement de l'injection de dépendance avec Spring: Le conteneur IoC

6
Jesper

L’idée de base de ce type d’architecture n’est guère différente de celle de la convention du printemps.

Disons que demain vous décidez, vous ne voulez pas avoir une seule application pour les deux projets, et allez dans un déploiement pour webapp et une autre pour le service Exemple UserService WebApp

donc, pour que WebApp se connecte à UserService, il devra faire des requêtes http pour obtenir tout type de données. vous devrez ensuite changer tout votre code WebApp pour le rendre compatible avec les nouveaux changements. Par exemple, au lieu d'appeler directement la méthode de service, vous appellerez httpClient. Pour éviter ce travail, vous pouvez utiliser l’interface Service pour implémenter votre propre ServiceImpl et y effectuer toutes les requêtes http, le reste restant intact. 

Des tâches similaires seront effectuées dans UserService, il aura son propre ServiceImpl comme avant mais sera appelé dans Controller en tant qu'objet singleton. 

Votre réponse: Vous pouvez vous référer directement à ServiceImpl, cela servira à cela, la différence n’est que lorsque ServiceImpl ne fait pas partie du module actuel ou de toute dépendance, mais que le projet final groupé aura probablement son implémentation via un module similaire

1
LNT

Lorsque vous utilisez l'annotation @Autowired , Spring recherche automatiquement dans son contexte d'application un candidat à injecter dans le contrôleur. Un candidat valide doit être une classe concrète marquée comme un bean Spring, en utilisant l'annotation @Service par exemple.

1
gWombat

@Controller - Controller est un point d’entrée où vous utilisez la requête provenant de l’interface utilisateur, définissez un ensemble de services et dumpez un chemin d’URI de mappage de requête qui indique quelle requête doit être renvoyée. Ensuite, vous créez un groupe de services sur lequel vous écrivez un groupe d'interfaces, puis vous pouvez continuer et créer un groupe de fichiers ServiceImplementation, puis DAO . Remarque sur Autowired: il apporte automatiquement l'instance que vous spécifiez dans @Service - Une classe particulière doit être traitée comme un service utilisé pour l'écriture de transactions DAO . @ Autowired apporte une "instance" dont vous avez besoin quelque part, nous essayons généralement de trouver les "services" que vous souhaitez dans l'annotation Autowired, Vous pouvez ajouter @qualifier pour éviter toute confusion quant à ce que vous voulez faire apparaître à partir de haricots similaires.

0
surendrapanday