136 votes

Configuration Xml versus configuration basée sur les annotations

Dans quelques grands projets sur lesquels j'ai travaillé récemment, il semble de plus en plus important de choisir l'un ou l'autre (XML ou Annotation). À mesure que les projets se développent, la cohérence est très importante pour la maintenabilité.

Mes questions sont les suivantes : quels sont les avantages de la configuration basée sur XML par rapport à la configuration basée sur les annotations et quels sont les avantages de la configuration basée sur les annotations par rapport à la configuration basée sur XML ?

204voto

MetroidFan2002 Points 11413

Les annotations ont leur utilité, mais elles ne sont pas la solution miracle pour tuer la configuration XML. Je recommande de mélanger les deux !

Par exemple, si vous utilisez Spring, il est tout à fait intuitif d'utiliser XML pour la partie injection de dépendances de votre application. Cela permet d'éloigner les dépendances du code qui l'utilisera. En revanche, l'utilisation d'une sorte d'annotation dans le code qui a besoin des dépendances rend le code conscient de cette configuration automatique.

Cependant, au lieu d'utiliser XML pour la gestion des transactions, marquer une méthode comme transactionnelle avec une annotation est parfaitement logique, car il s'agit d'une information qu'un programmeur souhaiterait probablement connaître. Mais le fait qu'une interface va être injectée en tant que sous-typeY au lieu de sous-typeX ne devrait pas être inclus dans la classe, parce que si maintenant vous souhaitez injecter le sous-typeX, vous devez modifier votre code, alors que vous aviez de toute façon un contrat d'interface auparavant, donc avec XML, vous auriez juste besoin de modifier les mappages XML et c'est assez rapide et sans douleur de le faire.

Je n'ai pas utilisé les annotations JPA, donc je ne sais pas si elles sont bonnes, mais je dirais que laisser le mappage des beans à la base de données en XML est aussi une bonne chose, car l'objet ne devrait pas se soucier de l'origine de ses informations, il devrait juste se soucier de ce qu'il peut faire avec ses informations. Mais si vous aimez JPA (je n'ai pas d'expérience avec lui), par tous les moyens, allez-y.

En général : Si une annotation fournit une fonctionnalité et agit comme un commentaire en soi, et ne lie pas le code à un processus spécifique afin de fonctionner normalement sans cette annotation, alors optez pour les annotations. Par exemple, une méthode transactionnelle marquée comme étant transactionnelle ne tue pas sa logique de fonctionnement, et sert également de bon commentaire au niveau du code. Sinon, il est probablement préférable d'exprimer ces informations en XML, car même si elles affecteront éventuellement le fonctionnement du code, elles ne changeront pas la fonctionnalité principale du code, et n'ont donc pas leur place dans les fichiers sources.

31voto

skaffman Points 197885

Il s'agit d'une question plus large, celle des métadonnées externalisées par rapport aux métadonnées intégrées. Si votre modèle d'objet ne doit persister que d'une seule façon, alors les méta-données en ligne (c'est-à-dire les annotations) sont plus compactes et plus lisibles.

Toutefois, si votre modèle d'objet est réutilisé dans différentes applications de telle sorte que chacune d'entre elles souhaite faire persister le modèle de différentes manières, l'externalisation des méta-données (c'est-à-dire les descripteurs XML) devient plus appropriée.

Ni l'un ni l'autre n'est meilleur, et donc les deux sont supportés, bien que les annotations soient plus à la mode. C'est pourquoi les nouveaux frameworks comme JPA ont tendance à les privilégier. Les API plus matures, comme Hibernate natif, proposent les deux, car on sait qu'aucun des deux n'est suffisant.

13voto

Huibert Gill Points 595

J'ai toujours considéré les annotations comme une sorte d'indicateur de qué une classe est capable de, ou comment il interagit avec les autres.

Pour moi, la configuration de Spring XML n'est que cela, configuration

Par exemple, les informations relatives à l'adresse IP et au port d'un proxy sont définitivement placées dans un fichier XML, il s'agit de la configuration de l'exécution.

Utilisation de @Autowire , @Element pour indiquer au framework ce qu'il doit faire avec la classe est une bonne utilisation des annotations.

En plaçant l'URL dans le @Webservice L'annotation est un mauvais style.

Mais ce n'est que mon opinion. La frontière entre interaction et configuration n'est pas toujours claire.

6voto

cliff.meyers Points 10394

J'utilise Spring depuis quelques années maintenant et la quantité de XML nécessaire devenait définitivement fastidieuse. Entre les nouveaux schémas XML et le support des annotations dans Spring 2.5, je fais habituellement ces choses :

  1. Utiliser "component-scan" pour charger automatiquement les classes qui utilisent @Repository, @Service ou @Component. En général, je donne un nom à chaque bean, puis je les relie entre eux à l'aide de @Resource. Je trouve que cette plomberie ne change pas très souvent, donc les annotations sont utiles.

  2. Utilisation de l'espace de nom "aop" pour toute la POA. Cela fonctionne vraiment bien. Je l'utilise toujours pour les transactions aussi parce que mettre @Transactional partout est un peu une corvée. Vous pouvez créer des raccourcis nommés pour les méthodes sur n'importe quel service ou référentiel et appliquer très rapidement les conseils.

  3. J'utilise LocalContainerEntityManagerFactoryBean avec HibernateJpaVendorAdapter pour configurer Hibernate. Cela permet à Hibernate de découvrir automatiquement et facilement les classes @Entity dans le classpath. Ensuite, je crée un bean SessionFactory nommé en utilisant "factory-bean" et "factory-method" faisant référence au LCEMFB.

4voto

Charles Chen Points 576

Je pense que la visibilité est une grande victoire avec une approche basée sur XML. Je trouve que le XML n'est pas vraiment si mauvais, étant donné les différents outils existants pour naviguer dans les documents XML (par exemple, Visual Studio + la fenêtre Structure de fichiers de ReSharper).

Vous pouvez certainement adopter une approche mixte, mais cela me semble dangereux, ne serait-ce que parce que, potentiellement, il serait difficile pour les nouveaux développeurs d'un projet de comprendre où les différents objets sont configurés ou mappés.

Je ne sais pas ; en fin de compte, l'enfer XML ne me semble pas si mauvais que ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X