<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Duchess France &#187; DDD</title>
	<atom:link href="http://jduchess.org/duchess-france/blog/tag/ddd/feed/" rel="self" type="application/rss+xml" />
	<link>http://jduchess.org/duchess-france</link>
	<description>A Duchess Community Blog for France</description>
	<lastBuildDate>Mon, 14 May 2012 17:33:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>DDD vs SOA &#8211; Lightweight killer apps with nothing but vanilla Java EE 6</title>
		<link>http://jduchess.org/duchess-france/blog/lightweight-killer-apps-with-nothing-but-vanilla-java-ee-6-ddd-vs-soa/</link>
		<comments>http://jduchess.org/duchess-france/blog/lightweight-killer-apps-with-nothing-but-vanilla-java-ee-6-ddd-vs-soa/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 13:15:49 +0000</pubDate>
		<dc:creator>Katia Aresti</dc:creator>
				<category><![CDATA[Les Conférences]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[ECB]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[EJB3]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE6]]></category>
		<category><![CDATA[ParisJUG]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://jduchess.org/duchess-france/?p=1180</guid>
		<description><![CDATA[Adam Bien est venu présenter sa vision de l&#8217;architecture Java EE lors de la session de Juillet du Paris JUG. Ce premier article présente la première partie de la soirée, plutôt dédiée aux concepts et à la théorie. Les applications développées sous la plateforme JEE 6 sont maintenant très légères. On est loin de l&#8217;ancienne [...]]]></description>
			<content:encoded><![CDATA[<p>Adam Bien est venu présenter sa vision de l&#8217;architecture Java EE lors de la session de Juillet du Paris JUG. Ce premier article présente la première partie de la soirée, plutôt dédiée aux concepts et à la théorie.</p>
<div id="attachment_1410" class="wp-caption alignleft" style="width: 431px"><a href="http://farm5.static.flickr.com/4126/5131351083_7986fe9be0.jpg"><img class="size-medium wp-image-1410          " title="Adam Bien - Java EE 6" src="http://farm5.static.flickr.com/4126/5131351083_7986fe9be0.jpg" alt="Adam Bien - Photo: Claude Falguière" width="421" height="278" /></a><p class="wp-caption-text">Adam Bien - Photo: Claude Falguière</p></div>
<p>Les applications développées sous la plateforme JEE 6 sont maintenant très légères. On est loin de l&#8217;ancienne affirmation <em>&#8220;les EJBs sont très lourds&#8221;</em> ; celle-ci fait désormais partie du passé. <strong>Adam Bien </strong>a démontré la puissance de la plateforme et il nous a donné envie de la réapprendre, surtout avec la deuxième partie de la conférence qui a été entièrement pratique comme il nous l&#8217;avait promis.  Le niveau du contenu théorique a été assez avancé. <strong>Nous vous conseillons la lecture, ou relecture rapide, de l&#8217;article précédent</strong> &#8211; <a title="EJB3 - SOA - DDD" href="http://jduchess.org/duchess-france/blog/soiree-adam-bien-au-paris-jug-0607/" target="_blank">Adam Bien / JEE6 / Architecture</a> &#8211; où vous est présenté Adam et dans lequel on vous plonge dans le contexte; ensuite vous pourrez repasser à cette partie plus détaillée qui s&#8217;appuie sur les concepts déjà traités.</p>
<p style="text-align: center"><span style="color: #993300"><strong>Commençons par la théorie des architectures !</strong></span></p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">Lightweight Killer Applications</h3>
<p>Grâce aux design patterns comme <em>&#8220;Convention over Configuration&#8221;</em>, <em>l&#8217;injection de dépendances</em> et les annotations, l&#8217;architecture des applications JEE6 est considérée <strong>LIGHTWEIGHT </strong>!  <strong>Que signifie &#8220;lightweight&#8221; ?</strong> Lightweight indique que l’architecture est rapide, simple, petite, légère, &#8220;facile&#8221;, lean (<em>maigre</em>) et qu&#8217;elle facilite le développement itératif et incrémental des applications d&#8217;entreprise.</p>
<p>Notez que le mot <strong>facile </strong>se trouve <strong>entre guillemets</strong> : Attention ! On peut mettre en péril la réussite des projets si on  sous-estime les difficultés et challenges lors du design et de l’implémentation sous JEE6.  Comme on l&#8217;avait déjà évoqué dans notre article précèdent, afin de répondre aux besoins réels des applications d’entreprise, on nous propose deux approches d&#8217;architecture opposées :</p>
<ul>
<li>Architecture pilotée par le Service (SOA &#8211; Service Oriented Architecture ≈ <strong>SOAP</strong>)</li>
<li>Architecture pilotée par le Domaine (DDD &#8211; Domain Driven Design ≈ <strong>REST</strong>)</li>
</ul>
<p>Adam utilise l’acronyme SOA afin de faciliter la compréhension, mais il a aussi souhaité faire la distinction en utilisant les termes <strong>&#8220;Design Piloté par le Service&#8221;</strong> car le concept SOA a un sens encore plus large. Concept apparu après l&#8217;EAI (&#8220;Enterprise Application Integration&#8221;), le SOA essaie de répondre aux besoins d&#8217;intégration et d&#8217;architecture au sens global. Avec le SOA on regarde le système d&#8217;information d&#8217;une entreprise comme un groupe de services au lieu de un groupe d&#8217;applications comme avec son précurseur EAI. Il existe aussi une nouvelle approche, ROA (Ressource Oriented Architecture), qui nous parle d&#8217;un vision ressource.  Mais au delà des concepts, il faut du travail pour la réalisation des applications !</p>
<p>Les deux types architectures décrits par Adam &#8211; DDD et SOA &#8211; sont des designs que l&#8217;on peut choisir pour développer les applications, et les deux s&#8217;appuient sur le pattern ECB comme l&#8217;on va voir ci-après.  Le pattern ECB existe depuis longtemps et il est indépendant de la plateforme JEE6 (ce n&#8217;est pas un pré-requis).</p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">ECB &#8211; Entity Control Boundary Pattern</h3>
<p>Similaire au pattern MCV (Model View Contrôler), il n&#8217;est pas consacré qu&#8217;à la couche présentation. Il est composé de trois éléments : <strong>Entity</strong>, <strong>Control </strong>et <strong>Boundary</strong></p>
<p>.</p>
<p style="text-align: center"><img class="aligncenter" src="http://farm5.static.flickr.com/4007/5132006088_11abd0f1cf.jpg" alt="Entity Control Boundary pattern" width="487" height="176" /></p>
<p><strong>&#8216;Entity&#8217; : </strong>Élément persistent et passif (il a besoin d&#8217;un contexte d&#8217;exécution pour fonctionner) qui contient non seulement les données persistantes mais également une partie de la logique métier.</p>
<p><strong>&#8216;Control&#8217;</strong> : Élément orchestrateur qui implémente un scénario donné. Il orchestre les entités pour récréer un scénario fonctionnel particulier, mais la logique métier propre à chaque type d&#8217;entité reste encapsulée dans l&#8217;entité.  <strong></strong></p>
<p><strong>&#8216;Boundary&#8217; :</strong> Élément qui se trouve en périphérie du système ou sous-système et s&#8217;occupe de la communication. Certains Boundarys s’occupent de l&#8217;entrée au système depuis l&#8217;extérieur (front-end) ; les autres fournissent la sortie (back-end).</p>
<p>Sur ce point, se pose une question importante : Avez-vous compté le nombre de <strong>couches </strong>? Il y en a <strong>deux</strong>. La couche &#8220;Boundary&#8221;, et la couche &#8220;Business&#8221; qui contient les éléments de contrôle et les entités.</p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">Où est la couche DAO ? A-t-elle disparu ?</h3>
<p>Oui, la couche DAO a disparu pour les opérations CRUD, mais elle <strong>sera encore là</strong>. Pourquoi ? La réalité est qu’<strong>on aura besoin des DAO dans la plupart des applications</strong> afin de respecter le principe <strong>DRY </strong>(<span style="text-decoration: underline">Don&#8217;t Repeat Yourself</span>) et la séparation des responsabilités. Une application classique réalise les mêmes opérations constamment. Sans un DAO dédié, les queries répétées seront arrosées par toute la couche business et cette duplication du code réduira considérablement la maintenance.</p>
<p>Pour bien expliquer ce point : il s&#8217;agit simplement de<strong> ne  plus jamais créer les DAO par défaut et uniquement parce que ce design pattern du catalogue J2EE le dit.</strong> Le pattern DAO n’est plus considéré la meilleure pratique à mettre en place. Aujourd’hui on va plutôt travailler en refactoring : <strong>Identifier le code dupliqué dans la couche business </strong>pour après le factoriser dans un DAO. Sans duplication de code,  mieux vaut déléguer directement à l’<strong>EntityManager</strong> depuis la couche business. Une couche DAO sans un vrai besoin augmentera l’effort de maintenance (plus de code, plus de tests) sans apporter une réelle valeur ajoutée.</p>
<p>Grâce aux <strong>generics</strong>, à partir du JDK 5 nous pouvons utiliser <strong>une couche DAO générale et très puissante</strong> qui fournira une API transverse aux applications.  Ainsi, pour vous illustrer cela avec un peu de code :</p>
<pre>@Stateless
@Local(CrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class CrudServiceBean implements CrudService {

    @PersistenceContext
    EntityManager em;

    public  T create(T t) {
        this.em.persist(t);
        this.em.flush();
        this.em.refresh(t);
        return t;
    }

    @SuppressWarnings("unchecked")
    public  T find(Cl<a class="wp-first-item" href="upload.php">Library</a>ass type,Object id) {
       return (T) this.em.find(type, id);
    }

    public void delete(Object t) {
       Object ref = this.em.getReference(t.getClass(), t);
       this.em.remove(ref);
    }

    public  T update(T t) {
        return (T)this.em.merge(t);
    }

    public List findWithNamedQuery(String namedQueryName){
        return this.em.createNamedQuery(namedQueryName).getResultList();
    }

   [...] 

}</pre>
<p>Dans ce code on voit un Service DAO qui est implémenté par un EJB @Local et @Stateless. On injecte le contexte persistent (@PersistentContext) et EntityManager. On utilise les génériques &lt;T&gt; pour factoriser le code qui est commun à n&#8217;importe quelle entité.  CrudService est l&#8217;interface qui sera exposé au client.</p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">L&#8217;utilisation des interfaces</h3>
<p>Comme on verra dans notre article suivant, l&#8217;utilisation des interfaces avec les EJBs n&#8217;est plus obligatoire. Dans ce point de la conférence, un débat a commencé : <strong>Est-il une bonne pratique le développement Interface + Implémentation ?</strong> Réaliser systématiquement une implémentation interface + classe ajoutera des fichiers à maintenir, et rendra l’application moins légère et l&#8217;API plus complexe<strong>. </strong>L&#8217;idée d&#8217;une interface est d&#8217;exposer une API et cacher l&#8217;implémentation. Par conséquent, si une classe ne changera pas d&#8217;implémentation, l&#8217;utilisation des interfaces n&#8217;apportera aucune valeur. Si l&#8217;API ne sera jamais exposé au client, non plus.  Sur ce point, lors de la partie questions/réponses, deux bonnes pratiques ont été évoquées :</p>
<ul>
<li>d&#8217;une part de différencier l’API externe (exposée au client) de l’API qui restera interne,</li>
<li>d&#8217;autre part d&#8217;identifier les objets avec le même comportement et une implémentation différente.</li>
</ul>
<p>Aussi l&#8217;usage de designs patterns comme &#8220;Strategy&#8221; imposent l&#8217;utilisation des interfaces.  Ensuite, avec ECB en tête, Adam est passé à l&#8217;implémentation de deux approches opposées : l&#8217;architecture pilotée par le domaine et l&#8217;architecture pilotée par le Service.</p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">DDD vs SOA : Domaine ou Service</h3>
<p>Comme vous pouvez constater dans l&#8217;image, les deux approches basent leur architecture sur le pattern ECB. <img style="margin: 30px 0px 20px" src="http://farm2.static.flickr.com/1142/5131398507_176a8a9d6c.jpg" alt="SOa vs DDD" width="911" height="480" /></p>
<p><strong>Afin de ne pas répéter notre article précèdent, et d&#8217;expliquer facilement le diagramme, voici un tableau récapitulatif. </strong> <strong></strong></p>
<p><strong><span style="text-decoration: underline">Piloté par le Domaine vs Piloté par le service</span> </strong></p>
<table border="0" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td width="150" align="center" valign="top"><strong> </strong></td>
<td width="400" align="center" valign="top"><strong>DDD (Domain Driven Design)</strong></td>
<td width="400" align="center" valign="top"><strong>SOA (Service Driven Design)</strong></td>
</tr>
<tr>
<td valign="top"><strong>Principal </strong></td>
<td valign="top">Domaine (Entity)</td>
<td valign="top">Service (Control)</td>
</tr>
<tr>
<td valign="top"><strong>Programmation </strong></td>
<td valign="top">Cherche l&#8217;orientation objet pure</td>
<td valign="top">Approche procédural</td>
</tr>
<tr>
<td valign="top"><strong>ECB &#8211; Entity</strong></td>
<td valign="top">PDO &#8211; Persistent Domain Objet. Contient du logique métier. Les entités ont leur état encapsulé et un comportement bien précis (true objects)</td>
<td valign="top">Anemic Object Model &#8211; Structure de données sans comportement qui expose son état à partir des modificateurs (get/set). Ne contient aucun logique métier</td>
</tr>
<tr>
<td valign="top"><strong>ECB &#8211; Control</strong></td>
<td valign="top">Ne contient quasiment pas de logique métier. Très léger, parfois inexistant.</td>
<td valign="top">Implémente toute le logique métier.</td>
</tr>
<tr>
<td valign="top"><strong>ECB &#8211; Boundary : </strong></td>
<td valign="top">Gateway &#8211; Expose et manage les entités (PDO). Nature <strong>Stateful </strong>(EJB @Stateful)</td>
<td valign="top">Façade &#8211; Cache les entités derrière les services. Nature <strong>Stateless </strong>(EJB @Stateless)</td>
</tr>
<tr>
<td valign="top"><strong>Nombre de couches : </strong></td>
<td valign="top">2 couches, pas besoin de DTO (Data Transfert Object)</td>
<td valign="top">plus de 2 couches. besoin de DTO (Data Transfert Object)</td>
</tr>
<tr>
<td valign="top"><strong>La couche DAO : </strong></td>
<td valign="top">utilise la stratégie décrite précédemment</td>
<td valign="top">utilise la stratégie décrite précédemment</td>
</tr>
<tr>
<td valign="top"><strong>S&#8217;intègre bien avec : </strong></td>
<td valign="top">REST</td>
<td valign="top">SOAP</td>
</tr>
</tbody>
</table>
<p>La vaste majorité des application J2EE / JEE existantes ont été développées avec l&#8217;approche procédural d&#8217;orientation au service. Avec les EJBs 2.x, penser à l&#8217;approche DDD n&#8217;était pas seulement une aberration, mais était quasiment impossible due à la complexité.</p>
<h3 style="text-align: left;margin: 30px 0px 20px 0px">Conclusions</h3>
<p>Les deux architectures opposées sont des meilleures pratiques dans des contextes particuliers. Ne soyons pas sectaires et restons ouverts aux deux approches. Dans la pratique, <strong>la plupart des projets du monde réel auront besoin d’une architecture mixte.</strong></p>
<div id="attachment_1405" class="wp-caption alignright" style="width: 410px"><a href="http://farm2.static.flickr.com/1390/5131987072_8488f99d8e.jpg"><img class="size-medium wp-image-1405  " title="Adam Bien - Conclusions" src="http://farm2.static.flickr.com/1390/5131987072_8488f99d8e.jpg" alt="Adam Bien - Photo: José Paumard" width="400" height="266" /></a><p class="wp-caption-text">Adam Bien - Photo: José Paumard</p></div>
<p>Adam a voulu nous transmettre un message aussi important que l’effet de connaître les frameworks du marché et les design patterns.  <strong></strong></p>
<p><strong>« Pensez toujours au vrai besoin, au contexte et à la valeur ajoutée »</strong></p>
<p>Une architecture en 5 couches dans la pratique n’apportera aucune valeur si notre application reste monolithique.  Grâce aux nouveautés de JEE 5 et 6, on peut réaliser des applications beaucoup plus légères qui répondront au vrai besoin.  Rappelons-nous qu&#8217;on n&#8217;applique pas les designs patterns pour le plaisir, mais pour répondre au besoin et pour obtenir une valeur ajoutée.  <strong></strong></p>
<p><strong>« Rester petit mais penser grand »</strong></p>
<p>Lorsqu’on est confronté à la réalisation d’une architecture, il est très important de bien identifier les cas d’évolutions probables auxquels l’application sera sujette. Dans ce contexte, on ne doit cependant pas réaliser le design d’une architecture en assurant toutes les possibilités d’évolution pour anticiper tous les besoins possibles, auquel cas on risque de rester éternellement dans la phase « design » sans en réaliser le développement. En anticipant <strong>seulement</strong> les besoins <strong>les plus probables</strong> on pense grand, tout en restant petit.  Une second article est dédié aux démonstrations de code de la deuxième partie de soirée.</p>
<p><a title="Partie pratique" href="http://jduchess.org/duchess-france/blog/ejb-3-x-lightweight-killer-apps-but-nothing-more-than-adam-in-action/" target="_blank">Pratique &#8211; EJB 3.x et Adam en action</a> <em></em></p>
<p><em>Article rédigé par Katia Aresti, relecture et corrections par Claude Falguière</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jduchess.org/duchess-france/blog/lightweight-killer-apps-with-nothing-but-vanilla-java-ee-6-ddd-vs-soa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Soirée Adam Bien au Paris JUG (06/07)</title>
		<link>http://jduchess.org/duchess-france/blog/soiree-adam-bien-au-paris-jug-0607/</link>
		<comments>http://jduchess.org/duchess-france/blog/soiree-adam-bien-au-paris-jug-0607/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 08:15:14 +0000</pubDate>
		<dc:creator>Katia Aresti</dc:creator>
				<category><![CDATA[L'actualité]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[EJB3]]></category>
		<category><![CDATA[JEE6]]></category>
		<category><![CDATA[LSOA]]></category>
		<category><![CDATA[ParisJUG]]></category>

		<guid isPermaLink="false">http://jduchess.org/duchess-france/?p=987</guid>
		<description><![CDATA[Le mardi 6 Juillet est le dernier Paris JUG avant la rentrée. Pour cette occasion, on compte sur la présence d&#8217;un speaker d&#8217;excellence : Adam Bien. Il va nous présenter deux architectures opposées &#8211; Lean Service Oriented Architecture (SOA) et Domain Driven Architecture &#8211; ainsi que la façon dont on les implémente sous la plateforme [...]]]></description>
			<content:encoded><![CDATA[<p>Le mardi 6 Juillet est le dernier Paris JUG avant la rentrée. Pour cette occasion, on compte sur la présence d&#8217;un speaker d&#8217;excellence : <strong>Adam Bien. </strong>Il va nous présenter deux architectures opposées &#8211; Lean Service Oriented Architecture (SOA) et Domain Driven Architecture &#8211; ainsi que la façon dont on les implémente sous la plateforme JEE 6 grâce aux EJB 3.</p>
<p>Histoire de vous mettre l&#8217;eau à la bouche, je vais vous présenter rapidement Adam Bien et les sujets qui seront traités plus en détail, argumentés, et accompagnés d&#8217;exemples pratiques et de retours d&#8217;expérience le <strong>mardi 6 juillet au Paris JUG</strong>.</p>
<h3 style="text-align: center;margin: 30px 0px 20px 0px"><span style="color: #800000"><strong>Une conférence à laquelle assister absolument !!</strong></span></h3>
<h2 style="margin: 30px 0px 15px 0px"><strong>Qui est Adam Bien ? </strong></h2>
<p>Adam Bien est un consultant indépendant, formateur Java, architecte du software et développeur qui  implémente des architectures Java à grande échelle au sein des entreprises allemandes.</p>
<p>Nommé Java Champion en Janvier 2007,  il est membre de NetBeans Dream Team, de Sun Advantage Partner, Glassfish System Integrator, du groupe d&#8217;experts Java Community Process (EJB 3.1, JPA 2.0, Java EE 6) et il est fortement impliqué dans les technologies Cloud, Grid et P2P. Actuellement, il travaille en parallèle comme architecte et développeur au sein de plusieurs projets d&#8217;architecture J2EE/Java EE 5/MDA et au sein des architectures EAI basés en composants pour Java EE et .Net.</p>
<p>Il est aussi connu pour ses nombreux articles et livres publiés dans le cadre Java/J2EE/J EE et l&#8217;architecture distribuée. Parmi ses livres, on peut trouver plusieurs ouvrages en allemand (<em>&#8220;Enterprise Architekturen&#8221;, &#8220;Java EE 5 Architeckturen&#8221;, &#8220;Struts&#8221; etc.</em> ) ainsi que son dernier livre publié en 2009 et écrit en anglais : <em>&#8220;Real World Java EE patterns&#8221;</em> où il explore les défis de Cloud Computing.</p>
<h2 style="margin: 30px 0px 15px 0px"><strong>EJB3 légers et pouvoir des annotations<br />
</strong></h2>
<p>Depuis des années, les EJB ont toujours été identifiés comme une technologie trop lourde. Effectivement, jusqu&#8217;à la version EJB 2 cette réputation était justifiée. Mais depuis la version EJB 3 tout a changé et on peut affirmer à présent que les EJB sont très légers. Ils sont configurés par annotation (non par de tonnes de XML), intégrés avec JPA (Java Persistence API), scalables au sein des machines multicore et avec multiples CPU, et constituent une solution standard et portable pour les applications métiers d&#8217;entreprise.</p>
<h3 style="margin: 20px 0px 10px 0px">&#8220;Convention over configuration&#8221;</h3>
<p>Le principe du design pattern &#8220;Convention over configuration&#8221; est le suivant : Les applications se basent sur des conventions au lieu de se baser sur la configuration. Ainsi, elles chercheront à réduire le nombre de fichiers de configuration, fourniront une configuration par défaut (convention par règle de nommage) mais permettront aussi la substitution des valeurs par défaut via la configuration (à partir des fichiers ou une autre source de données).</p>
<p>La mise en place de ce pattern passe par l&#8217;utilisation des annotations. Les EJB 3 ont toujours besoin de la même quantité d&#8217;information pour fonctionner. Cette information étant la même dans 80% des cas, il suffit, par exemple, de placer l&#8217;annotation @Stateless sur une classe POJO (Plain Old Java Object) pour lui donner le comportement de base d&#8217;une entité de session.</p>
<h3 style="margin: 20px 0px 10px 0px">Injection de dépendances<strong><em><br />
</em></strong></h3>
<p>Il s&#8217;agit de retirer des objets la gestion des dépendances entre les objets et de la confier à un conteneur, le conteneur des EJBs dans ce cas.  Ainsi, pour utiliser une instance EJB, on se servira de l&#8217;annotation @EJB pour l&#8217;injecter, pour utiliser une ressource (JMS, Datasource) on utilisera l&#8217;annotation @Ressource etc.</p>
<p>ex : Voici un EJB qui &#8220;injecte&#8221; un autre EJB de service. Le conteneur des EJBs s&#8217;occupe de chercher l&#8217;instance du Service pour que le client puisse l&#8217;utiliser.</p>
<pre>@Stateless
public class ClientBean implements Client {
     @EJB
     private Service service;

     public String sayHello() {
          return this.service.getMessage();
     }
}</pre>
<p>La plateforme JEE 6 permet grâce aux EJBs d&#8217;implémenter deux approches d&#8217;architecture opposées :</p>
<ul>
<li>Lean Service Oriented Architecture (SOA) &#8211; Architecture légère Orientée au Service</li>
<li>Domain Driven Architectue &#8211; Architecture pilotée par le Domaine</li>
</ul>
<h2 style="margin: 30px 0px 15px 0px"><strong>Approche 1 : Lean Service Oriented Architecture (SOA) </strong></h2>
<p>Dans le modèle d&#8217;architecture SOA, comme son nom l&#8217;indique, l&#8217;entité la plus importante est le <strong>Service</strong>. On peut considérer un service comme un contrat, un use case, même un story, qui exécute une ou plusieurs opérations (transactions). Le principe est de l&#8217;exposer au système d&#8217;information et d&#8217;encapsuler non seulement son implémentation mais aussi sa localisation.</p>
<h3 style="margin: 20px 0px 10px 0px">Interfaces et packages</h3>
<p>Les bases d&#8217;une implémentation avec Java/JEE sont les interfaces et les packages. La fonctionnalité d&#8217;un package est exposée via une interface (parfois par plusieurs). On définira d&#8217;abord les interfaces des services à exposer, pour ensuite créer les classes qui implémenteront leur logique métier.</p>
<p>Diviser les responsabilités &#8211; &#8220;divide and conquer&#8221;- facilite la réutilisabilité et améliore la maintenance du code. Ainsi, sans trop détailler :</p>
<ul>
<li>Une <strong>classe </strong>annotée<strong> </strong>@Stateless et @Remote servira de façade. Cet EJB fournira le contrôle d&#8217;accès aux services, ainsi que le comportement transactionnel; il <strong>implémentera l&#8217;interface</strong> à exposer.</li>
<li>Une <strong>classe </strong>annotée @Stateless et @Local servira de service. Cet EJB implémentera le métier et ne sera accessible qu&#8217;à partir de la façade.</li>
</ul>
<p>Les <strong>annotations</strong> des EJBs seront placées <strong>sur la classe d&#8217;implémentation</strong> et jamais sur l&#8217;interface; ainsi, <strong>les services exposés sont indépendants de l&#8217;API EJB</strong> et leur implémentation est complètement encapsulée.</p>
<h3 style="margin: 20px 0px 10px 0px">Les objets du domaine</h3>
<p>Si les façades implémentent la logique d&#8217;accès et les services la logique métier, il ne reste plus grand chose aux objets du domaine. Ils encapsulent un état mais n&#8217;ont  aucune logique métier. Les entités JPA sont des classes annotées @Entity qui contiennent des attributs, des accesseurs (getter/setter) et c&#8217;est tout. Ce pattern (même considéré un anti-pattern par les puristes de la POO) est connu sous le nom &#8220;Anemic Object Model&#8221; et colle parfaitement avec les besoins de SOA.</p>
<p>La majorité des applications d&#8217;entreprise J2EE/ J EE d&#8217;aujourd&#8217;hui sont proches de l&#8217;architecture décrite précédemment. Néanmoins, elle convient parfaitement jusqu&#8217;au moment où le comportement dépend du type des objets. L&#8217;implémentation des services utilise alors des instructions du type <em>&#8220;instanceof&#8221;</em> ou encore des blocs<em>&#8220;if/else&#8221; </em>et <em>&#8220;case&#8221;</em> pour s&#8217;y adapter. Ceci est la conséquence directe du  &#8220;Anemic Object Model&#8221; qui déplace le contrôle en dehors des entités au détriment des services et façades où se trouve la vrai logique métier.</p>
<h2 style="margin: 30px 0px 15px 0px"><strong>Approche 2 : Domain Driven Architecture Design </strong></h2>
<p>L&#8217;architecture pilotée par le domaine est basée sur l&#8217;utilisation de<strong> vrais objets</strong> (true objects). Ces objets encapsulent leur état et fournissent également des  comportements, bien définis en fonction du type.</p>
<h3 style="margin: 20px 0px 10px 0px">PDO</h3>
<p>Les objets du domaine sont le socle de l&#8217;application. Ils gèrent leur état,  la persistance de leur état et implémentent la logique métier. Il arrive même dans certains cas que l&#8217;on n&#8217;ait pas besoin d&#8217;utiliser de service.</p>
<p>Les entités PDO (Persistent Domain Object) sont persistantes. Ainsi, chaque changement, au niveau de leur état ou de leurs relations, sera automatiquement synchronisé avec le moteur de persistance à la fin de la transaction. Ils seront exposés publiquement; cela oblige le concepteur à bien réfléchir à l&#8217;API qui sera fournie au client.</p>
<h3 style="margin: 20px 0px 10px 0px">Gateways</h3>
<p>Les PDO sont passifs et ne démarquent pas de transactions<em><strong><span style="color: #99cc00"> </span></strong></em>; ils ont besoin d&#8217;un contexte d&#8217;exécution pour fonctionner.</p>
<p>Cela va nous poser un  problème à cause de la <strong>nature stateless</strong> des applications Java EE : après l&#8217;invocation d&#8217;une méthode transactionnelle, via un service ou un service façade, toutes les entités JPA &#8211; les PDO &#8211; sont détachées. Le client perd le contexte transactionnel; on est constamment obligé de transporter et de &#8220;merger&#8221; tout le contexte entre le client et le serveur avec les difficultés que cela implique.</p>
<p><strong>Solution: </strong>Créer un <strong>&#8220;anti service façade&#8221; </strong>- un <strong>gateway</strong>. On ne cache plus les entités derrière une façade, on les expose  le plus possible aux couches supérieures telles que la couche Présentation et on permet à ces couches de les modifier directement . Cette stratégie, contradictoire avec les principes J2EE classiques sur la maintenance, semble dans certains cas plus pratique dans les projets du monde réel. Il s&#8217;agit tout simplement de se débarrasser des couches inutiles et d&#8217;exposer la couche domaine à la couche présentation. Chaque changement du domaine est directement visible depuis l&#8217;IHM.</p>
<p>Une gateway est implémentée par une classe annotée @Stateful et @Local &#8211; un EJB &#8211; qui manage aussi les transactions et contient l&#8217;EntityManager et le contexte persistent.</p>
<h2 style="margin: 30px 0px 15px 0px"><strong><strong>Conclusion </strong></strong></h2>
<p>Ce qui est une bonne pratique chez l&#8217;un est un anti-pattern chez l&#8217;autre. Or, les deux approches opposées sont applicables, parfois complémentaires et nécessaires.</p>
<p>Java EE 6 et les EJBs permettent les deux types d&#8217;implémentations. Un point à  noter, l&#8217;approche SOA semble avoir une bonne affinité avec SOAP et les WebServices. Par contre, l&#8217;approche Domaine semble mieux s&#8217;accorder avec des architectures de type REST qui est focalisé sur une manipulation directe des ressources.</p>
<h3 style="text-align: center;margin: 20px 0px 10px 0px">Des démos, du code et toutes les réponses à vos questions, directement adressées à Adam&#8230;  <span style="text-decoration: underline"><strong><span style="color: #ff0000"> </span></strong></span></h3>
<h3 style="text-align: center;margin: 20px 0px 10px 0px"><span style="color: #000000"><span style="text-decoration: underline"><strong>dans le prochain Paris JUG !! </strong></span></span></h3>
<h3 style="text-align: center;margin: 20px 0px 10px 0px"><strong><a href="http://parisjug.org/xwiki/bin/view/Meeting/20100706">Inscrivez-vous !!</a></strong></h3>
<p><span style="color: #993300"><strong><span style="color: #000000"><span style="font-weight: normal">Les inscriptions ouvriront </span>Jeudi 1er le matin<span style="font-weight: normal">. Soyez prêtes, ces temps-ci les place partent très vite.  Si vous voulez recevoir la notification de l&#8217;ouverture par e-mail jeudi matin pour pouvez vous abonner à la mailing list <a href="http://parisjug.org/xwiki/bin/view/Main/MailingList" target="_blank">Annonces </a>du JUG.</span></span></strong></span></p>
<div style="margin: 5px 0 5px 0">Les sources utilisées pour cet article sont les suivantes :</p>
<ul>
<li><a href="http://www.javaworld.com/javaworld/jw-10-2008/jw-10-ejb3.html" target="_blank">EJB3</a></li>
<li><a href="http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html" target="_blank">Lean Service Architecture</a></li>
<li><a href="http://www.javaworld.com/javaworld/jw-05-2009/jw-05-domain-driven-design.html" target="_blank">Domain Driven Architecture</a></li>
</ul>
</div>
<p><strong> </strong></p>
<div id="_mcePaste" style="overflow: hidden;width: 1px;height: 1px"><span style="color: #1f497d">Il arrive même dans certains cas que l’on ait pas  besoin d’utiliser de service</span></div>
]]></content:encoded>
			<wfw:commentRss>http://jduchess.org/duchess-france/blog/soiree-adam-bien-au-paris-jug-0607/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 14/18 queries in 0.196 seconds using disk: basic
Object Caching 482/486 objects using disk: basic

Served from: jduchess.org @ 2012-05-22 21:05:54 -->
