Code de l'architecture de l'interface de service et de service impl classes printemps
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 des pensions.
Service est une interface de service et de 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 au service impl codes de contrôleur, nous appelons la méthode de la classe de service :-
@Autowired
Service service;
Object obj = service.someMethod();
Comment le contrôleur d'exécuter du code de ServiceImpl
classe
OriginalL'auteur viper | 2016-05-31
Vous devez vous connecter pour publier un commentaire.
C'est essentiellement la manière des travaux du Printemps:
Le service de la mise en œuvre devrait être une source de haricot (il doit avoir un
@Component
ou@Service
annotation, ou devraient être définies dans un Ressort fichier de configuration XML), de sorte que le Printemps va le trouver et de l'inscrire dans le Ressort de contexte de l'application.Alors vous utiliser l'injection de dépendance, par le biais de la
@Autowired
d'annotation, d'injecter de la mise en œuvre du service dans le contrôleur. Cela signifie que le Printemps va regarder votre contrôleur, il va trouver de l'@Autowired
annotation sur leservice
membre de la variable et de l'initialiser avec un haricot qu'il trouve dans le contexte de l'application, qui sera l'instance de la mise en œuvre des services de classe qu'il a enregistrée plus tôt. Donc, après le Printemps est fait,service
fera référence à l'instance deServiceImpl
.Voir le Printemps Cadre de la documentation de référence pour plus d'informations sur la façon d'injection de dépendance fonctionne avec le Printemps: Le conteneur IoC
Service
interface avec plusieurs classes? Dont la mise en œuvre du code sera exécuté.Si vous avez plusieurs beans Spring qui mettent en œuvre
Service
ensuite, vous obtiendrez un message d'erreur lorsque vous démarrez l'application, parce que le Printemps ne sais pas lequel choisir. Il y a des manières de dire au Printemps de laquelle choisir, par exemple à l'aide de@Qualifier
ou@Primary
.Merci pour la réponse, monsieur. Mais pourquoi le printemps utilise ce genre de avec patrons? Je pense qu'en temps normal
mvc
motif, il n'est pas nécessaire rôle d'une interface de classe. Il est nécessaire de forcer leServiceImpl
classes pour implémenter certaines méthodes.L'interface n'est pas absolument nécessaire pour le Printemps. Il aurait travaillé exactement la même sans l'interface. Mais le point d'avoir l'interface est de séparer la mise en œuvre, de sorte que vous avez moins de couplage, et il facilite, par exemple, injecter une simulation de la mise en œuvre du service pour les tests unitaires.
Disons que vous avez un StudentService, qui permettent d'économiser de MySQL aujourd'hui.Plus tard, vous pourriez obtenir une nouvelle exigence pour enregistrer de Mongo plus Elastic Search.Si vous venez de classe de service,vous devez modifier les services existants de la classe.Si vous aviez une interface, il suffit d'ajouter une mise en œuvre.Vous pouvez brancher que la nouvelle de la mise en œuvre d'une autre dépendance, même sans en changer une ligne de code.Dire vous avez besoin de la fonctionnalité de sélection, mais la fonctionnalité sur un démarrage paramètre de ligne de commande.Ensuite, vous pouvez avoir plusieurs implémentations et choisir au moment de l'exécution, selon certains qualificatif.Je pense que la maintenabilité est la clé ici.
OriginalL'auteur Jesper
Idée de base de cette architecture est un peu différent de juste de printemps de la convention.
Permet de dire que demain vous décidez, vous ne voulez pas avoir de demande unique pour les deux projets, et aller dans l'un de déploiement de l'application web et l'autre pour le service
Exemple
UserService
WebApp
donc pour WebApp pour se connecter à UserService il devra effectuer des requêtes http pour obtenir tout type de données. ensuite, vous devrez modifier tous vos WebApp code pour le rendre compatible à de nouveaux changements. Par exemple, plutôt que directement à l'appel de la méthode de Service, vous appelez httpClient. Pour éviter ce retravailler ce que vous pouvez faire est, à l'Aide de l'interface de Service de mettre en œuvre votre propre ServiceImpl et de faire toutes les requête http là, reste intacte.
Les trucs similaires seront réalisés dans UserService, il aura son propre ServiceImpl comme avant, mais sera appelée au Contrôleur comme un objet singleton.
Votre réponse :
Vous pouvez vous référer à ServiceImpl directement, il sera au service de l'objectif, la différence n'est que lorsque ServiceImpl n'est pas une partie de module en cours ou de toute dépendance, mais au final livré projet aura à sa mise en œuvre par le biais de certains de la fratrie module probablement
OriginalL'auteur LNT
Lorsque vous utilisez l'annotation @Autocâblés, le Printemps sera automatiquement recherche dans son contexte d'application d'un candidat d'être injecté dans le contrôleur. Un candidat valide doit être une classe concrète marqué comme un Ressort de haricots, à l'aide de l'annotation @Service par exemple.
OriginalL'auteur gWombat
@Controller - Contrôleur est un point d'entrée où vous consommez de la demande en provenance de l'Interface Utilisateur, et de définir un ensemble de services, et le dump d'un requestmapping chemin de l'URI qui raconte ce qui lui demande de venir en arrière-plan, ce qui de revenir. Ensuite, vous créez des tas de services, lorsque vous écrivez des tas d'interfaces, et ensuite vous pouvez aller sur, et de créer des tas de ServiceImplementation fichiers, puis de DAO.
Note sur Autocâblés :il amène automatiquement instance que vous spécifiez dans
@Service - classe Particulière doit être traité en tant que service, utilisés pour l'écriture, DAO transactions.
@Autocâblés apporte une "instance" vous avez besoin de quelque part, habituellement, nous essayons de trouver les "services" que vous voulez à partir de Autocâblés annotation, vous pouvez ajouter un @qualifier pour éviter la confusion de ce que l'instance spécifique de sortir de semblable haricots.
OriginalL'auteur surendrapanday