À quoi servent les EJB

je suis en train d'apprendre le Jave-EE, j'ai beaucoup D'expérience du C++ et J'ai appris le Java SE. Je ne comprends pas le but D'Enterprise Java Beans; quelqu'un peut clarifier cela pour moi. Je ne suis pas intéressé par legacy utilisations: c'est dans le contexte de EJB-3.1 et Java-EE 6.

il semble que certaines personnes les utilisent pour contenir la logique d'affaires, pour mettre en œuvre la couche d'affaires de l'architecture classique à trois couches. Qui sépare le logique du domaine à partir des objets du domaine, conduisant à un modèle de domaine anémique . Mais cela va à l'encontre de tous mes instincts OOD; je suis d'accord avec Martin Fowler que c'est un anti-modèle . Devrais-je relâcher mes objections à un modèle de domaine anémique? Ou les EJB ont-ils d'autres usages?

20
demandé sur Raedwald 2011-04-07 14:49:34

7 réponses

L'utilisation de Java EE n'implique pas automatiquement un modèle de domaine anémique, tout comme vous pouvez écrire du code en java ce qui ne fait pas bon usage des meilleures pratiques ne signifie pas que ce n'est pas possible en java. Je crois que le point de Martin Fowler était J2EE (notez l'utilisation de J2EE et non Java EE) opération assez forcée de la logique et des données. L'utilisation d'entités basées sur le POJO permet de modéliser les données et le comportement de manière appropriée. La" logique d'entreprise " dans votre EJBs orchestre typiquement l'application de l'entreprise logique mais le plus souvent qu'il n'est pas réellement effectuer, il est généralement un emballage très mince.

EJBs ainsi former votre API de Service, vous avez besoin de cette quelle plate-forme/cadre que vous utilisez, vous avez besoin d'avoir quelque chose que vous pouvez invoquer physiquement, il est un point d'entrée. Que vous utilisiez spring, les services web, etc... Vous avez besoin d'une couche service, il n'y a rien pour arrêter cela a été implémenté dans Java EE. Un exemple plutôt artificiel

@Stateless
public SomeServiceImpl implements SomeService
    someServiceMethod() {
       delegate.doSomething();
    }
}

public SomeServiceDelegate implements SomeService
    someServiceMethod() {
       modelObject.doSomething();
    }
}

Je ne vais pas entrer dans les raisons de préférer les EJBs à toute autre technologie, je veux juste souligner que les utiliser ne signifie pas que votre mise en œuvre ne peut pas utiliser les meilleures pratiques.

6
répondu vickirk 2013-11-04 20:00:53

comme l'indiquent plusieurs autres réponses, les EJB sont parfaits pour la mise en œuvre de la couche service. Ce sont des haricots très modernes et légers à Java EE. Malgré le nom, vous ne pouvez pas les comparer avec les bêtes draconiennes de poids lourd EJB2 qui étaient dans J2EE. Tout le monde est d'accord ces ont été un désastre, mais ce n'est plus 2002.

depuis EJB3 (2006), les haricots EJB sont une technologie parfaitement fine.

ils aide beaucoup ici en fournissant des transactions déclaratives (chaque méthode d'entrée démarre automatiquement une transaction si on n'est pas déjà en cours, bien que cela puisse être changé si désiré), la mise en commun, la sécurité, le verrouillage, remoting et puis certains. Voir les réponses suivantes pour plus de détails:

les Transactions ont été expliquées ici, mais pour ajouter à cela: ce n'est pas quelque chose qui est seulement nécessaire pour des systèmes hautement complexes et hautement sécurisés. J'irais même jusqu'à dire que c'est un exigence de base même lorsqu'il s'agit uniquement de bases de données. Si je traite une commande simple, je veux que l'inventaire et la commande sont à la fois mis à jour ou les deux pas du tout. C'est aussi basique que d'avoir des PK et des FK dans votre base de données pour assurer l'intégrité.

les EJB rendent la gestion des transactions triviale. Sans EJBs, il y a beaucoup de code boilerplate pour démarrer, commettre ou faire reculer le tx.

il ne faut pas non plus sous-estimez les avantages de la mise en commun et des talons que procure la BEI. Cela signifie un bean peut avoir beaucoup d'Ejb injecté, et vous n'avez pas à vous inquiéter d'être instancié à chaque fois qu'une telle bean est créé. Autrement, cela serait particulièrement gênant, car tous les EJB ne seraient pas utilisés à chaque fois.

en raison de la mise en commun, cependant, seuls des bouchons très légers sont injectés, qui sont plus proches d'une sorte d'URLs qui pointent vers une instance réelle. Ces coûts à côté de rien en termes de mémoire ou cpu à injecter.

EJBs propose également des annotations pour les déclarer comme étant des Singletons, organiser leur comportement de verrouillage (écrire des serrures/lire des serrures), en déclarer une devrait être initialisée au démarrage, leur permettre de gérer un contexte de persistance étendu (un contexte de persistance Non scopé à un TX), etc.

ce sont toutes les préoccupations que vous ne voulez pas dans votre slim entités. Dans de nombreuses architectures, un Objet utilisateur par exemple est une entité de données simple que je veux envoyer à travers les couches. Je ne veux pas que mon instance D'utilisateur ait une méthode sendMsg() et une ressource JMS comme dépendance, de sorte que l'envoi de message puisse soudainement être fait à partir d'un client. Je ne sais pas vraiment pourquoi les gens pensent que c'est en quelque sorte "naturel" et "OOP".

dans le monde réel je n'invoque pas non plus une opération sendMsg sur mon ami Joe chaque fois que je veux lui envoyer une carte postale. Au lieu de cela, je m'adresse à une carte et d'apporter au bureau de poste ou dans une boîte aux lettres.

Je n'invoque pas non plus une opération de cuisson() sur un gâteau. Au lieu de cela, j'ai mis le gâteau dans un four, etc.

17
répondu Arjan Tijms 2017-05-23 12:24:43

vous citez déjà le cas d'utilisation" implémenter business logic".

EJBs-in EJB 3.Session x, les Haricots, les Message Driven Beans et en 3.1 la nouvelle Singleton Haricots en effet vous permettre de mettre en œuvre le biz de la logique. Session Beans server souvent comme façade où les clients se connectent. Ces clients peuvent être des Servlets pour servir du contenu via par exemple HTTP ou aussi des clients "gros" qui parlent sur d'autres protocoles (plus binaires) aux EJBs.

Message Driven Beans servir endpoint de communications asynchrones et peuvent eux-mêmes appeler des méthodes sur les haricots de Session comme un exemple.

tous les EJB ont une chose en commun, ce qui les rend très attractifs: ils sont gérés par un conteneur. Ainsi, le conteneur s'occupe de l'instanciation, de la mise en commun, des Transactions, de la sécurité, etc.

si vous écrivez dans un EJB

@Resource DataSource x;

le conteneur s'assure que lorsque votre haricot est prêt à recevoir des appels de méthode, le la variable " x " contient une source de données appropriée.

la mise en commun de fèves vous permet d'avoir beaucoup plus de clients connectés à un site que vous ne pourriez le faire sans, Car soit les instances sont partagées (apatrides SB) ou les instances peuvent être échangées par le conteneur à 2ndary storage si la mémoire est étroite et de les réactiver plus tard.

En EJB 3, l'ancien EntityBeans de EJB 1.x et 2.x sont partis et remplacés par JPA, qui construit le modèle de données de domaine de POJOs, qui peut être annoté pour fournir la sémantique relationnelle ou la sémantique peut être fournie par des fichiers XML externes.

avec JPA (qui ne nécessite pas D'EJBs du tout), les EJBs servent souvent à mettre en œuvre le traitement de ces entités:

@Stateless
public class MyBean {
    @PersistenceContext EntityManager em;

    public Foo getFoo(String name) {
        Query q = em.createQuery("SELECT f FROM Foo f WHERE f.name = :name");
        q.setParameter("name",name);
        return q.getSingleValue();
    }
}
6
répondu Heiko Rupp 2011-04-07 11:38:47

quelques points:

  • les EJB n'existent pas par elles-mêmes; ils vivent dans un conteneur EJB, qui vous offre des services très utiles à travers eux, tels que la sécurité déclarative, les transactions déclaratives et le regroupement relativement facile.
  • alors qu'il est vrai que les modèles de domaines anémiques sont un anti-modèle: une fois que votre logique d'affaires devient plus complexe, par exemple lorsque plusieurs applications fonctionnent sur le même modèle, séparant la plupart des la logique du modèle devient une question de la séparation des préoccupations.
5
répondu Michael Borgwardt 2011-06-23 09:26:40

juste une remarque d'expérience personnelle ...

Je ne doute pas des avantages des RJE, mais ayant travaillé avec eux, je considère que les RJE ne conviennent que dans les cas où la sécurité et les transactions sont très importantes (I. e: applications financières). Pour 90% des cas, vous seriez très bien sans EJBs. Un autre chose ... scalability et EJBs ne sont pas de bons amis.

2
répondu Manuel Salvadores 2011-04-07 11:32:08

certains gars raconte dans une discussion comme celle-ci que L'EJB devient utile dans L'EJB3 pas avant cela, et ce n'est pas vrai. à droite, il est devenu plus puissant spécialement avec le JPA, mais EJB1.0 et EJB2.J'en ai encore fait beaucoup. peut-être qu'ils ne l'ont pas utilisé dans les grandes applications donc ils disent que.

par exemple POJO ne peut pas traiter une Transaction, donc dans EJB vous pouvez spécifier le type de transaction pour une méthode spécifique est-il nécessaire d'une nouvelle transaction ou il ne vient pas de la transaction .

dans mon organisation, nous avons ERP construire à partir de zéro en utilisant et nous utilisons la EJB dans la logique de L'entreprise, il était de 2000 et la EJB était la Version 1.0 . et ce n'est pas seulement séparer le business tier des autres thiers, mais c'est aussi séparer le système les uns des autres., exemple: le module des Finances est distinct du module des RH. et s'ils veulent ajouter un nouveau module, ils peuvent ajouter sans redémarrer le système et il va s'intégrer avec le système de manière parfaite..

et rappelez-vous ceci dans L'EJB: ce que vous voyez dans le code n'est rien et ce que le conteneur EJB fait pour vous est tout :) .

2
répondu Majed 2011-04-15 11:43:34