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?
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 LayerVous 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
@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