2017-09-18 1 views
1

Quand utiliser un service ou un composant au printemps?Quand utiliser le service ou un composant au printemps?

Par exemple, un module chargé d'envoyer un courrier électronique ou une logique métier commune est-il un "service" ou un "composant"? et quelle est la différence?

Un service est-il en mesure d'appeler les autres services? Y a-t-il un problème de transaction? ou un service devrait appeler les composants seulement? Quelqu'un m'a dit qu'un service ne devrait jamais appeler les autres services et devrait seulement appeler les composants à la place, ce qui signifie Controller-> Service-> Component-> DAO, mais j'ai trouvé que beaucoup de gens partagent le concept de Controller-> Service -> DAO sans composant.

Y a-t-il des critères de conception de système sur ce sujet dans Spring?

+2

Votre question est trop large. Copie proposée: https://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in –

Répondre

3

Afin de « configurer » printemps afin qu'il puisse vous fournit les instances des classes dont vous avez besoin vous êtes censé dire Spring ce que objets sont impliqués et comment le sont construits . Pour ce faire, vous pouvez utiliser un fichier de configuration XML ou par annotations

Dans le cas où vous prenez vous pouvez utiliser @Component pour annoter la classe l'approche d'annotation (à mon humble avis une bien meilleure et plus simple). C'est comme dire à Spring: "Hé, je veux que vous sachiez que vous pourriez avoir besoin d'une instance de cette classe, peut-être parce que je la demande, peut-être parce que quelque chose que j'ai demandé en a besoin". Alors annoter une classe ce @Component laissez printemps savoir qu'il existe

Il y a d'autres annotations qui font la même:

  • @Controller (et @RestController)
  • @Service
  • @Repository

Ils ont tous informé Spring que la classe est impliquée dans le contexte DI. Mais le aussi avoir un sens sémantique:

  • @Controller = @Component appartenant à couche de présentation
  • @Service = @Component appartenant au service/Utilisation couche Case
  • @Repository = @Component appartenant à la persistance couche

Vous pouvez trouver plus d'informations dans this question

Un service peut-il appeler les autres services?

Je ne vois aucun problème avec cela. Si l'un de vos services nécessite de faire certaines actions qui sont déjà effectuées par d'autres, vous voulez sûrement éviter la réplication de code. Tant que vous respectez la dépendance des couches d'architecture (ne jamais monter), tout ira bien.

À propos de ce que vous pouvez vérifier this article sur Architecture Clean

2

@Component est générique pour les autres stéréotypes.
Ainsi, vous pouvez remplacer @Repository, @Service, @Controller par @Component et rien ne changera. Mais pour une meilleure lisibilité, vous devez utiliser @Repository, @Service, @Controller

+0

pas exactement vrai. '@ Repository' ajoute une gestion des exceptions spécifique aux bases de données. et oui d'autres annotations n'ajoutent rien mais c'est une question de temps. Il pourrait y avoir des ajouts dans le futur. –