Y a-t-il des inconvénients à lier mon application au framework Spring?
Je ne parle pas de bugs ou de problèmes comme celui-ci, le cas échéant. Je parle de choses stratégiques et architecturales qui influenceront le cycle de vie de mon application.
Dois-je préférer Spring à Java Fonctionnalités de base EE prises en charge par le conteneur EE? Quels sont les avantages?
Étant donné que d'autres articles ici mentionnent la hausse, je mentionnerai les aspects négatifs de Spring. Même avec ces points négatifs, Spring est omniprésent dans sa niche, fiable et fonctionne comme annoncé.
Donc, sur les points négatifs:
Énorme: je ne voudrais pas mettre des bocaux avec 3000 classes dans mon petit projet de loisir.
Il y a certaines descriptions de celui-ci comme plus lent que certains autres cadres DI comme Guice ou Pico. anecdotique, et probablement pas trop important.
Traiter certaines parties de Spring peut être frustrant quand elles ne sont pas bien documentées et que la documentation diffère entre les multiples versions principales.
En tant qu'effet secondaire de sa taille, soyez prêt à passer des heures joyeuses à fouiller dans des tas de classes qui, bien que logiquement nommées, commencent à fusionner en un gigantesque tas de noms lorsque vous êtes fatigué ("bien sûr, vous connectez simplement votre TransactionAwareConnectionFactoryProxy à votre UserCredentialsConnectionFactoryAdapter à votre .. zzzzzzzz "). Pour être honnête, ils sont vraiment logiquement nommés, c'est une réponse raisonnable à la taille du cadre, mais quand même.
Peut-être à cause de cette adaptation de nouvelles pièces, le printemps peut être lent, du moins pour moi. Pas tellement avec le ressort de base, mais il y a des connecteurs pour à peu près tout, et ils ne sont pas tous aussi bien documentés qu'ils pourraient l'être, et c'est à ce moment-là que vous commencez à patauger dans la soupe nominale. Encore une fois, c'est vraiment juste en réponse à sa taille.
Il y a très peu d'inconvénients au printemps
J'ai réfléchi longuement et durement afin de trouver des inconvénients sérieux à l'utilisation de Spring, et j'ai bien peur d'avoir échoué. Spring est une excellente boîte à outils dans les modèles JEE/OSGi. Il fournit une large gamme de modèles non invasifs qui simplifient considérablement le travail avec les API de support souvent lourdes fournies par les conteneurs d'applications.
Spring vs the core JEE
Spring ne remplace pas les technologies JEE de base - peut-être des EJB, mais avec la nouvelle spécification EJB3, il n'y a presque rien - au lieu de cela, il fournit des modèles pour les rendre beaucoup plus faciles. Considérez JAX-RS, l'API des services Web RESTful. Spring fournit le RestTemplate
qui est généralement utilisé comme suit (supposons qu'il soit injecté):
SomeJaxbAnnotatedClass object = restTemplate.getForObject(someURI,SomeJaxbAnnotatedClass.class);
Cela ira à someURI
récupérer le XML/JSON/YAML et le démarsaler dans l'objet de domaine que vous spécifiez. Le tout dans une seule ligne de code.
Les exceptions et la journalisation des erreurs sont traitées comme des exceptions d'exécution, ce qui facilite la propreté du code local. Spring travaille même pour réduire les dépendances externes dans la mesure du possible, donc l'exemple ci-dessus utilise uniquement les packages Java.net. *).
Il existe des modèles pour JMS, JAX-WS, JPA, JTA et ainsi de suite. Tous facilitent l'utilisation de ces normes et rendent votre code plus propre et moins sujet aux erreurs.
architecture Pick'n'mix
D'un point de vue architectural, Spring met l'accent sur une approche pick'n'mix légère. Cela a pour effet de permettre aux architectes système d'éviter l'utilisation de conteneurs d'application tout-pour-tout gonflés tels que WebSphere, JBoss ou Glassfish et de choisir leurs homologues légers à la place - Jetty, Tomcat et ainsi de suite.
Pourquoi est-ce important? Les conteneurs d'applications plus volumineux ont un cycle de mise à jour beaucoup plus long qui convient davantage aux besoins de certains clients que d'autres. Les banques n'ont pas besoin d'être aussi agiles qu'une startup individuelle.
Si vous souhaitez utiliser la dernière version des frameworks de support, il est peu probable que vous les trouviez dans les grands conteneurs d'application. Au lieu de cela, vous devrez les inclure manuellement et Spring vous facilite la tâche.
De plus, vous devez uniquement inclure spécifiquement les technologies dont vous avez besoin. Les conteneurs d'application vous donneront JMS, EJB et tout autre acronyme sous le soleil, mais vous voulez juste une persistance facile avec JPA. Incluez Spring et Hibernate et vous avez terminé.
Alors pourquoi pas le printemps?
Évitez Spring si vous souhaitez utiliser les implémentations spécifiques aux fournisseurs des bibliothèques. Aussi, évitez-le si vous souhaitez conserver vos détails de configuration dans vos classes plutôt que de les externaliser en XML ou JNDI. Et évitez-le définitivement si vous pensez que les solutions libres et open-source ne conviennent pas à votre environnement.
une chose intéressante que Martin Thompson mentionne dans cet article est que le printemps peut avoir un impact non trivial sur les temps GC:
Gardez les piles d'appels raisonnablement petites. Encore du travail à faire ici. Si vous êtes assez fou pour utiliser Spring, consultez vos piles d'appels pour voir ce que je veux dire! Le garbage collector doit les accompagner à la recherche d'objets accessibles. -Martin Thompson
Ce genre de chose ne sera pas un gros problème pour la plupart des types d'applications, mais c'est une préoccupation très réelle pour les types d'applications auxquels Martin fait référence.
Le printemps est vraiment bon. Spring Core est très bien. J'ajouterais aux autres points, si vous êtes dans la catégorie de niche où les performances sont vraiment un problème, vous voudrez éviter les autres modules Spring, uniquement si vous êtes entre les mains des meilleurs développeurs. Ce n'est une préoccupation que si vous exécutez un système où les performances sont vraiment critiques. Entre les mains de développeurs moyens à bons, Spring vous donnera probablement un coup de pouce en termes de performances en aidant à écrire du code simple et propre.
Spring s'efforce de ne pas être invasif pour le maintenir librement couplé à votre code d'application.
Il se déplace également davantage dans cette direction sur le tiem. Dans les versions antérieures, vous deviez étendre les classes de base, puis il était déplacé vers les annotations, et de nos jours, il est de plus en plus fréquent d'utiliser des POJO configurés en XML.
Il s'agit d'un énorme avantage stratégique par rapport aux autres cadres d'application.
Le printemps fait désormais partie intégrante de la plateforme. Partout dans JEE5 et 6, vous trouverez de plus en plus d'injection de ressources, donc au moins cette partie de Spring, si vous vous en tenez à elle, n'est/ne sera qu'une autre partie de la plate-forme, (voir @Inject). D'autres parties ... pas si sûres, surtout quand il s'agit de programmation orientée aspect. Il existe d'autres fournisseurs de ces services, Guice, originaire de Google, et Weld, de JBoss, je crois basé sur Guice, fournira les mêmes fonctionnalités si vous vous en tenez à la dépendance JSR-330 Java spécifications d'injection.
YMMV