web-dev-qa-db-fra.com

Dois-je utiliser EJB3 ou Spring pour ma couche métier?

Mon équipe développe un nouveau produit orienté services avec un front-end web. Lors des discussions sur les technologies que nous utiliserons, nous avons décidé d'exécuter un serveur d'applications JBoss, un frontend Flex (avec un déploiement possible sur ordinateur à l'aide d'Adobe AIR) et des services Web pour interfacer le client et le serveur.

Nous sommes dans une impasse en ce qui concerne la technologie de serveur à utiliser pour notre logique métier. Le gros argument est entre EJB3 et Spring, nos principales préoccupations étant l'évolutivité et les performances, ainsi que la maintenabilité de la base de code.

Voici mes questions:

  1. Quels sont les arguments pour ou contre EJB3 vs Spring?
    • À quels pièges puis-je m'attendre avec chacun?
    • Où puis-je trouver de bonnes informations de référence?
71
Justin Standard

Il n'y aura pas beaucoup de différence entre EJB3 et Spring en fonction des performances. Nous avons choisi Spring pour les raisons suivantes (non mentionnées dans la question):

  • Spring conduit l'architecture dans une direction qui prend plus facilement en charge les tests unitaires. Par exemple, injectez un objet DAO simulé pour tester unitaire votre couche de gestion ou utilisez l'objet MockHttpRequest de Spring pour tester un servlet. Nous maintenons une configuration Spring distincte pour les tests unitaires qui nous permet d'isoler les tests sur les couches spécifiques.
  • Un pilote primordial était la compatibilité. Si vous devez prendre en charge plusieurs serveurs d'applications (ou si vous souhaitez éventuellement l'option de passer de JBoss à Glassfish, etc.), vous transporterez essentiellement votre conteneur (Spring) avec vous, plutôt que de compter sur la compatibilité entre les différentes implémentations de la Spécification EJB3.
  • Spring permet des choix technologiques pour la persistance, la communication à distance d'objets, etc. Par exemple, nous utilisons également un frontal Flex et utilisons le protocole Hessian pour les communications entre Flex et Spring.
72
John Stauffer

L'écart entre l'EJB3 et le Spring est beaucoup plus petit qu'il ne l'était, clairement. Cela dit, l'un des inconvénients de l'EJB3 est que vous ne pouvez injecter que dans un bean, vous pouvez donc finir par transformer des composants en beans qui n'ont pas besoin de l'être.

L'argument concernant les tests unitaires est maintenant assez hors de propos - EJB3 est clairement conçu pour être plus facilement testable unitaire.

L'argument de compatibilité ci-dessus est également peu pertinent: que vous utilisiez EJB3 ou Spring, vous dépendez toujours des implémentations fournies par des tiers de gestionnaires de transactions, JMS, etc.

Mais ce qui me ferait vibrer, c'est le soutien de la communauté. En travaillant sur un projet EJB3 l'année dernière, il n'y avait tout simplement pas beaucoup de gens qui l'utilisaient et parlaient de leurs problèmes. Le printemps, à tort ou à raison, est extrêmement omniprésent, particulièrement dans l'entreprise, et il est plus facile de trouver quelqu'un qui a le même problème que vous essayez de résoudre.

37
PEELY

Quels sont les arguments pour ou contre EJB3 vs Spring? Spring innove toujours et reconnaît les contraintes du monde réel. Spring offrait simplicité et élégance aux serveurs d'applications Java 1.4 et ne nécessitait pas de version de la spécification J2EE à laquelle personne n'avait accès en 2004-2006. À ce stade, il s'agit presque d'un religieux débat dans lequel vous pouvez être aspiré - Spring + abstraction + open-source contre les spécifications Java Enterprise Edition (Java EE) 5.0).

Je pense que Spring complète plus que ses concurrents les spécifications Java EE. Comme les fonctionnalités qui étaient autrefois uniques à Spring continuent pour être intégré dans la spécification, beaucoup diront que l'EJB 3 offre un ensemble de fonctionnalités "assez bon" pour la plupart des applications métier internes.

Quels pièges puis-je m'attendre avec chacun? Si vous traitez cela comme un problème de persistance (Spring + JPA) par rapport à EJB3, vous ne faites vraiment pas un tel choix.

Où puis-je trouver de bonnes informations de référence? Je n'ai pas suivi les résultats de référence spécj pendant un certain temps, mais ils étaient populaires pour quelque temps. Il semble que chaque fournisseur (IBM, JBOSS, Oracle et Sun) soit de moins en moins intéressé à avoir un serveur conforme. Les listes deviennent de plus en plus courtes de fournisseurs certifiés au fur et à mesure que vous passez de 1.3, 1.4. 1.5 Java Enterprise Edition. Je pense que l'époque d'un serveur géant entièrement conforme à toutes les spécifications est révolue.

18
Brian

Je recommanderais certainement EJB3 au printemps. Nous constatons qu'il est plus rationalisé, plus agréable à coder et mieux pris en charge. Dans le passé, j'ai utilisé Spring et je l'ai trouvé très déroutant, et pas aussi bien documenté que EJB3 (ou JPA je suppose à la fin de la journée)

  1. Depuis EJB3, vous n'avez plus à gérer les fichiers de configuration externes et il n'y a qu'un seul POJO que vous annotez par table de base de données. Ce POJO peut être transmis à votre niveau Web sans aucun problème. Les IDE comme Netbeans peuvent même générer automatiquement ces POJO pour vous. Nous avons utilisé EJB3 maintenant comme back-end pour un certain nombre d'applications à grande échelle, et nous n'avons remarqué aucun problème de performances. Vos Session Beans peuvent être facilement exposés en tant que services Web que vous pouvez exposer à votre interface Flex. Les beans session sont faciles à verrouiller au niveau de la méthode ou de la classe pour attribuer des rôles et des choses de ce genre si vous en avez besoin.

Je ne peux pas parler autant du printemps, car je ne l'ai essayé que pendant quelques semaines. Mais mon impression générale était très mauvaise. Cela ne signifie pas que c'est un mauvais framework, mais notre équipe ici a trouvé que EJB3 était le meilleur pour la couche persistance/business.

9
rustyshelf

J'ai tendance à préférer Spring à EJB3 mais ma recommandation serait quelle que soit l'approche que vous adoptez, essayez de vous en tenir à l'écriture des POJO et utilisez les annotations standard lorsque cela est possible, comme les annotations JSR telles que @PostConstruct, @PreDestroy et @Resource qui fonctionnent avec les deux EJB3 ou Spring afin que vous puissiez choisir le cadre que vous préférez.

par exemple. vous pouvez décider d'un projet pour utiliser Guice à la place pour l'IoC.

Si vous souhaitez utiliser l'injection de pré-demande comme dans une application Web, vous trouverez peut-être que Guice est un peu plus rapide pour l'injection de dépendance que Spring.

Les beans session se résument principalement à l'injection de dépendances et aux transactions; donc EJB3 et Spring sont un peu similaires pour ça. Là où Spring a l'avantage, c'est une meilleure injection de dépendances et de meilleures abstractions pour des choses comme JMS

7
James Strachan

j'ai utilisé une architecture très similaire dans le passé. Spring + Java 1.5 + Actionscript 2/3 lorsqu'il est combiné avec Flex Data Services, il est très facile (et amusant!) De coder. Cependant, un frontal Flex signifie que vous avez besoin de machines clientes suffisamment puissantes .

2
Soumitra

Concernant votre question:

Quels sont les arguments pour ou contre EJB3 vs Spring?

Je suggère de lire la réponse des experts: NE RÉPONSE À: EJB 3 ET ANALYSE COMPARATIVE DE PRINTEMPS par Mark Fisher . Lisez les commentaires pour trouver les remarques de Reza Rahman (EJB 3.0).

1
krams

Une autre chose en faveur du ressort est que la plupart des autres outils/cadres ont un meilleur support pour l'intégration avec le ressort, la plupart d'entre eux utilisent également le ressort en interne (par exemple activemq, camel, CXF, etc.).

Il est également plus mature et il y a beaucoup plus de ressources (livres, articles, meilleures pratiques, etc.) et développeurs expérimentés disponibles que pour EJB3.

0
kamal.gs