Où dois-annotation @Service-ils être conservés? De l'Interface ou de la mise en Œuvre?
Je suis du développement d'une application à l'aide de Printemps. Je suis nécessaires à l'utilisation de la @Service
annotation. J'ai ServiceI
et ServiceImpl
tels que ServiceImpl implements ServiceI
. Je suis confus ici, où dois-je conserver le @Service
annotation.
Dois-je annoter l'interface ou de la mise en œuvre avec @Service
? Quelles sont les différences entre ces deux approches?
- C'est ma réponse à un autre post: stackoverflow.com/questions/38618995/...
Vous devez vous connecter pour publier un commentaire.
Je n'ai jamais mis
@Component
(ou@Service
, ...), à l'interface, parce que ce l'interface inutile. Laissez-moi vous expliquer pourquoi.revendication 1: Si vous disposez d'une interface, alors vous voulez utiliser cette interface pour le point d'injection de type.
la revendication 2: Le but d'une interface, c'est que cela permet de définir un contrat qui peut être mis en œuvre par plusieurs implémentations. De l'autre côté, vous avez votre point d'injection (
@Autowired
). Ayant tout juste une interface et une classe en œuvre, est (à mon humble avis) inutile, et viole YAGNI.fait: Quand vous mettez:
@Component
(ou@Service
, ...), à l'interface,alors vous obtiendrez et
NoUniqueBeanDefinitionException
(ou vous avez un très spécial configurations de l'installation, de l'Environnement, des Profils ou des Qualificatifs ...)
Conclusion: Si vous utilisez
@Component
(ou@Service
, ...), à l'interface alors vous devez les violer au moins l'un des deux clains. Donc je pense qu'il n'est pas utile (sauf quelques rares scénarios) pour mettre@Component
au niveau de l'interface.Spring-Data-JPA Référentiel des interfaces sont quelque chose de totalement différent
NoUniqueBenDefinitionException
) et 2) l'utilisation@Qualifier
pour identifier un service spécifique.@Transactional
est l'un des exemples où une procuration à un bean est utilisé. L'AOP est un autre.Essentiellement des annotations comme @Service, @Référentiel, @Composant, etc. ils servent tous le même but:
De mon expérience, je suis toujours à l'aide de
@Service
annotation sur les interfaces ou des classes abstraites et des annotations comme@Component
et@Repository
pour leur mise en œuvre.@Component
annotation que j'utilise ces classes qui sert de base à des fins, simple beans Spring, rien de plus.@Repository
annotation j'utilise dans leDAO
couche, par exemple, si j'ai à communiquer à la base de données, ont certaines transactions, etc.Je vous suggère d'annoter votre interface avec le
@Service
et d'autres couches en fonction de la fonctionnalité.J'ai utilisé @Composant, @Service, @Contrôleur et @Référentiel annotations uniquement sur la mise en œuvre des classes et non pas sur l'interface. Mais @Autocâblés annotation avec des Interfaces toujours travaillé pour moi.
Pros de mettre annotation @Service est qu'il donne une allusion au fait que c'est un service. Je ne sais pas si la mise en œuvre de la classe par défaut, l'héritage de ce annoation.
Con côté, c'est que vous êtes couplage votre interface avec un cadre spécifique c'est à dire de Printemps, en utilisant le printemps spécifiques d'annotation.
Comme les interfaces sont censés être découplés de la mise en œuvre, je ne voudrais pas suggérer à l'aide d'un cadre spécifique d'Annotations ou de la partie de l'objet de votre interface.
Un des avantages de printemps est de basculer facilement d'un Service (ou d'autres) de la mise en œuvre.
Pour cela, vous devez annoter sur l'interface et de déclarer la variable comme ceci :
et non pas :
Comme le premier cas, vous pouvez activer la mise en œuvre d'injecter à partir du moment où il est unique (une seule classe implémente l'interface).
Dans le second cas, vous avez besoin de revoir tout le code (la nouvelle implémentation de la classe a un autre nom).
En conséquence, l'annotation doit être sur l'interface autant que possible. En outre, JDK procurations sont bien adaptés pour cela : ils sont créés et instancié au démarrage de l'application, car runtime type est connu par avance, contrairement à CGlib procurations.
Pour le dire simplement:
@Service est un Stéréotype d'annotation pour la service couche.
@Référentiel est un Stéréotype d'annotation pour la persistance couche.
@Composante est un générique stéréotype d'annotation utilisé pour indiquer le Printemps pour créer une instance de l'objet dans le Contexte de l'Application. Il est possible de
définir un nom pour l'instance, la valeur par défaut est le nom de la classe que camel cas.
Il y a 5 annotations qui pourrait être utilisé pour faire des beans spring. La liste ci-dessous des réponses.
Avez-vous vraiment besoin d'une interface? Si vous allez avoir une mise en œuvre pour chaque interface de service, simplement l'éviter, utiliser uniquement de la classe. Bien sûr, si vous n'avez pas de RMI ou de l'interface proxy est nécessaire.
@Repository - utilisation de l'injection de votre dao couche de classes.
@Service - utilisation de l'injection de votre couche de service des classes. Dans la couche de service aussi, vous pourriez avoir besoin d'utiliser @Transactional annotation pour la db, la gestion des transactions.
@Contrôleur de l'utilisation de votre interface de la couche de contrôleurs, tels que les JSF géré haricots injection, comme le printemps des haricots.
@RestController - utilisation pour le printemps reste contrôleurs, cela pourrait vous aider à éviter à chaque fois de mettre @ResponseBody et @RequestBody annotations dans votre repos méthodes.
@Composante de l'utiliser dans les autres cas lorsque vous avez besoin d'Injecter de printemps de haricot qui n'est pas le contrôleur, le service ou la classe dao