7
votes

Pourquoi les contrôleurs annotés de printemps sont-ils préférables aux mappages traditionnels?

Si je comprends bien, il y a deux avantages principaux aux contrôleurs annotés au printemps:

  1. Élimination de la nécessité d'étendre une classe de base / mettre en œuvre une interface.
  2. Élimination d'un autre fichier de configuration.

    Cela semble apporter deux inconvénients principaux, cependant:

    1. Le couplage entre le cadre et le contrôleur semblerait être plus serré avec l'utilisation d'annotations, par rapport à l'utilisation d'une extension / de mise en œuvre de classe.
    2. Un seul fichier contenant des mappages semble plus facile à entretenir, plutôt que de creuser via du code dans plusieurs fichiers à la recherche d'une annotation.

      Bien que je considère personnellement les inconvénients susmentionnés pour l'emporter sur les avantages, l'utilisation d'annotations semble être préférée. Cela m'amène à la question: Pourquoi les contrôleurs annotés de printemps sont-ils préférables aux mappages traditionnels?

      Modifier en ce qui concerne le couplage:

      Je me rends compte que dans les deux situations, il y a un couplage avec le cadre sous-jacent impliqué. L'interface contrôleur requise par le ressort est constituée d'une méthode unique et pourrait être principalement abstraite (par exemple, une interface MyController s'étend SpringController ). Les annotations d'autre part, en dehors d'être spécifique au cadre, nécessitent un tas d'importations dans chaque fichier.


3 commentaires

Une meilleure question pour moi est «Pourquoi Springsource ne documente que l'approche d'annotation dans leur manuel de référence?». Ils ont supprimé la documentation de configuration MVC de style XML, que je trouve ennuyeux.


@skaffman Yup, c'est l'une des meilleures parties de la référence de printemps: Spring classique MVC :-)


@skaffman Ça devient droit au point :-)


5 Réponses :


1
votes

Je ne pense pas qu'un seul fichier est plus facile à maintenir. Un grand que j'ai trouvé est que les annotations vous permettent d'utiliser des objets dans plus que du projet et qu'ils apportent leur configuration avec eux. Je n'ai pas besoin de modifier la source, puis de me souvenir de chaque projet qui l'utilise et de la correction de leurs fichiers de configuration. Cela crée une manière plus modulaire de penser et de développer.


0 commentaires

1
votes
  1. Le couplage est plus souple. Une classe annotée ne dépend pas des méthodes ou des interfaces de classe des parents et peut être encapsulée dans une classe conforme à n'importe quel cadre, si vous choisissez ultérieurement de migrer. Vous aurez toujours besoin de supprimer les annotations de la plupart des compilateurs, mais le code et la logique ne devront pas être modifiés, seulement complétés pour fournir les paramètres et l'écoulement d'appels de la même manière à Spring @ MVC.

  2. Cela dépend du type et de l'échelle de la maintenance si on est plus perturbateur que l'autre. Si vous devez modifier la configuration des entités multiples, il est plus irritant pour passer à l'aide des différents fichiers Java dans la configuration annotée. Tandis que si vous refactez le contrôleur et que les URL changent changent, cela dans la classe Java serait moins perturbateur que de modifier un fichier XML distinct (qui contient de nombreuses lignes non applicables au changement effectué).


0 commentaires

2
votes

Il y a plusieurs avantages supplémentaires:

  • regroupement logique de plusieurs actions dans une seule classe de contrôleur (bien que cela soit aussi possible avec multicictioncontroller , mais pas si flexible)

  • Simplification des tests d'unités, car dans la plupart des cas, vous pouvez passer des arguments simples et ne pas avoir besoin de préparer simule httpservletQuest / httpservletresponse s.

  • flexibilité supplémentaire de mappage avec @requestparam , @pathvariable , etc. (bien qu'il puisse être mis en œuvre dans des contrôleurs traditionnels, mais je pense pas si élégant que annotations dus à la nature statique des contrôleurs traditionnels).

    Aussi, je ne peux pas être d'accord avec le premier désavantage - à mon avis, les annotations introduisent beaucoup moins de couplage que l'héritage. Par exemple, vous pouvez même utiliser un contrôleur annoté compilé comme une classe normale sans ressort dans la classe de classe (bien que la compilation du code source annoté nécessite toujours des annotations dans le chemin de construction).


3 commentaires

Il suffit de mentionner que le test de printemps fournit les moqueurs requis pour la demande / la réponse. Mais toujours, c'est mieux sans eux.


Je reçois une erreur de compilation si je n'impose pas le code de ressort pertinent pour prendre en charge mes annotations.


@etheros: Je voulais dire forme compilée. Dans la forme compilée, des annotations inconnues sont ignorées.



3
votes

Permettez-moi de discuter avec les inconvénients:

  1. Ce n'est pas le cas. C'est des métadonnées qui peuvent facilement disparaître sans affecter la fonctionnalité. D'autre part, devoir prolonger certaines classes et utiliser leurs méthodes empêchent de se débarrasser de la structure plus tard.

  2. C'est la même chose. J'ai utilisé à la fois des approches et non plus mal. Avec les capacités de recherche IDE modernes, et avec des conventions de dénomination appropriées, il n'est pas tout aussi facile d'avoir un seul fichier de configuration.


0 commentaires

1
votes

En plus des réponses existantes, je pense que cela vaut la peine de mentionner que le printemps MVC a une séparation propre entre le gestionnaire mappings et le gestionnaire adaptateurs . .

L'ancien dicte quel manutentionnaire doit être invoqué pour une demande donnée, et ce dernier détermine comment ce gestionnaire doit être invoqué.

Un que l'un extrême, vous avez "Classic" printemps MVC, avec les mappages définis dans XML et l'adaptateur défini par la hiérarchie de la classe classique de style . À l'autre extrême, vous avez @Controller et @RequestMappage , avec tout défini dans les annotations.

Cependant, il est parfaitement acceptable de mélanger et de faire correspondre. Par exemple, vous pouvez définir les mappages d'URL dans XML, "Old-style", mais toujours utiliser des classes de manutention -Controller . De cette façon, vous évitez de mettre des mappages d'URL dans les annotations (ce qui n'est pas toujours une bonne chose), qui conserve la flexibilité de la signature de classe considérablement améliorée (et une dépendance réduite à l'API de ressort) des annotations.

Cette capacité à mélanger des approches signifie que vous pouvez plutôt définir l'approche le mieux pour vous.


0 commentaires