web-dev-qa-db-fra.com

Quand utiliser un service ou un composant au printemps?

Quand utiliser un service ou un composant au printemps?

Par exemple, un module est-il responsable de l'envoi d'e-mails ou d'une logique métier commune, un "service" ou un "composant"? et quelle est la différence?

Un service peut-il appeler les autres services? Y a-t-il un problème de transaction? ou un service doit appeler uniquement les composants?

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 avec aucun composant.

Existe-t-il des critères de conception de système sur ce sujet au printemps?

10
ChiaChih wu

Afin de "configurer" Spring afin qu'il puisse vous fournir les instances des classes dont vous avez besoin, vous êtes censé dire à Spring quoi les objets sont impliqués et comment = les sont construits. Pour ce faire, vous pouvez utiliser un fichier de configuration xml ou via des annotations

Dans le cas où vous adoptez l'approche d'annotation (à mon humble avis beaucoup mieux et plus simple), vous pouvez utiliser @Component pour annoter la classe. 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". Donc, annoter une classe cette @Component faites juste savoir à Spring qu'elle existe

Il existe d'autres annotations qui font de même:

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

Ils informent tous Spring que la classe est impliquée dans le contexte DI. Mais ils ont également une signification sémantique:

  • @Controller = @Component appartenant à Presentation Layer
  • @Service = @Component appartenant à la couche Service/Use Case
  • @Repository = @Component appartenant à Persistence Layer

Vous pouvez trouver plus d'informations dans cette question

Un service doit-il pouvoir appeler les autres services?

Je ne vois aucun problème avec cela. Si l'un de vos services nécessite de réaliser certaines actions déjà effectuées par d'autres, vous voulez certainement éviter la duplication de code. Tant que vous respectez la dépendance des couches d'architecture (sans jamais augmenter), tout ira bien.

À ce sujet, vous pouvez vérifier cet article à propos de l'architecture propre

17
Pelocho

@Component est générique pour d'autres stéréotypes.
Vous pouvez donc remplacer @Repository, @Service, @Controller avec @Component et rien ne changera. Mais pour une meilleure lisibilité, vous devez utiliser @Repository, @Service, @Controller

3
Roman Danilov