<?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/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; annotation</title> <atom:link href="http://blog.xebia.fr/tag/annotation/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>Java en Production &#8211; L&#8217;audit</title><link>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/</link> <comments>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/#comments</comments> <pubDate>Wed, 25 Aug 2010 11:40:04 +0000</pubDate> <dc:creator>Cyrille Le Clerc</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[aspect]]></category> <category><![CDATA[audit]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[Production]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=5252</guid> <description><![CDATA[Après avoir abordé la gestion des fichiers de logs, nous continuons aujourd&#8217;hui la série &#171;&#160;Applications Java prêtes pour la Production&#160;&#187; avec l&#8217;audit. Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application. Pourquoi auditer ? Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples [...]]]></description> <content:encoded><![CDATA[<p>Après avoir abordé la gestion des <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="fichiers de logs" >fichiers de logs</a>, nous continuons aujourd&#8217;hui la série &laquo;&nbsp;Applications Java prêtes pour la Production&nbsp;&raquo; avec l&#8217;audit.</p><p>Par audit, nous entendons l&#8217;audit des actions importantes réalisées sur une application.</p><h3><a
name="Pourquoiauditer"></a>Pourquoi auditer ?</h3><p>Est-il vraiment utile de générer des informations d&#8217;audit dans nos applications ? Sans explications de juriste, quelques exemples suffiront à nous en convaincre :</p><ul><li>Un site web de partage de photos doit pouvoir dire qui a uploadé quelle image, depuis quelle adresse IP et à quelle date.</li><li>L&#8217;application d&#8217;administration d&#8217;un site de e-commerce doit tracer toutes les modifications de prix pour empêcher un <em>employé astucieux</em> de baisser à 1 euro le prix de son téléphone préféré le temps de passer commande.</li></ul><p>Pour revenir à des explications plus théoriques, les logs d&#8217;audit nous apportent :</p><ul><li>les informations nécessaires à la justice en cas d&#8217;infraction,</li><li>la détection d&#8217;intrusions,</li><li>la reconstitution des événements en complément des logs d&#8217;exceptions pour aider au diagnostique de problèmes.</li></ul><p>Nous nous placerons dans le cas le plus fréquent où nous ne développons pas d&#8217;outil pour consulter ces informations d&#8217;audit et où un accès direct au média de stockage (<code>grep</code> sur fichier texte, sql sur base de données, etc) suffit.</p><h3><a
name="Quefautilauditer"></a>Que faut-il auditer ?</h3><p>Dans un monde idéal, le contenu des messages serait défini avec les équipes de sécurité. En pratique, nous sommes assez seuls pour les choisir et il ne faut pas dramatiser. Si l&#8217;on ne prend pas le sujet à la légère, après quelques itérations, notre bon sens est le plus souvent suffisant.</p><p>Les éléments clefs à tracer sont :</p><ul><li>L&#8217;heure exacte : il est essentiel que les serveurs soient à l&#8217;heure pour corréler les logs des différentes briques du système d&#8217;information. Le sujet est aujourd&#8217;hui censé être banal pour les équipes système (c.f. <a
href="http://en.wikipedia.org/wiki/Network_Time_Protocol" title="NTP" >NTP</a>) et nous pouvons demander le soutien des équipes sécurité pour obtenir gain de cause.</li><li>L&#8217;action réalisée : il s&#8217;agit souvent du nom de la méthode métier appelée.</li><li>L&#8217;identifiant et/ou la valeur des données métier sensibles manipulées : souvent les <code>id</code> ou le <code>toString()</code> des paramètres d&#8217;appel.</li><li>L&#8217;auteur de la manipulation : nom de l&#8217;utilisateur connecté et son adresse ip (pour plus de détails sur l&#8217;adresse ip : <a
href="http://code.google.com/p/xebia-france/wiki/XForwardedFilter" title="XForwardedFilter" >XForwardedFilter</a> et <a
href="http://blog.xebia.fr/2009/05/05/tomcat-adresse-ip-de-linternaute-load-balancer-reverse-proxy-et-header-http-x-forwarded-for/" title="Tomcat  Adresse IP de linternaute load balancer reverse proxy et header Http XForwardedFor" >Tomcat : Adresse IP de l&#8217;internaute, load balancer, reverse proxy et header Http X-Forwarded-For</a>).</li><li>La description succincte des exceptions levées pour analyser les éventuelles attaques.</li></ul><h3><a
name="Pourquoileslogsdaccsdesserveur"></a>Pourquoi les logs d&#8217;accès des serveurs http ne suffisent pas ?</h3><p>La première idée serait de se contenter des logs d&#8217;accès des serveurs web et des firewalls pour auditer les accès à nos applications ; nous n&#8217;aurions alors plus rien à faire.</p><p>Hélas, cela n&#8217;est pas suffisant car il manque dans les logs http des informations clefs :</p><ul><li>Nous n&#8217;avons pas l&#8217;identité de l&#8217;appelant : on a bien l&#8217;adresse ip mais pas le login de l&#8217;utilisateur authentifié.</li><li>Nous n&#8217;avons pas les id passés en paramètre des opérations à auditer (sauf si on fait du REST) ; en SOAP, nous n&#8217;avons même pas le nom de l&#8217;opération !</li><li>Nous n&#8217;avons pas le détail des exceptions levées par l&#8217;application.</li></ul><h3><a
name="APIFrameworkdelogvsframeworkdd"></a>API : Framework de log vs. framework dédié</h3><p>Dans un monde idéal, le framework d&#8217;audit ne devrait pas dépendre de la configuration des logs pour ne pas risquer qu&#8217;une mauvaise manipulation de ces configurations de logs ne le désactive.</p><p>En pratique, les frameworks de logs sont les briques les plus performantes et les plus matures pour traiter les besoins d&#8217;écriture d&#8217;audit et la probabilité de désactiver l&#8217;audit en faisant une mauvaise manipulation sur la configuration des logs est négligeable. Ces raisons nous amènent à utiliser <a
href="http://www.slf4j.org/" title="SLF4J" >SLF4J</a> avec <a
href="http://logback.qos.ch/" title="logback" >logback</a> ou <a
href="http://logging.apache.org/log4j/1.2/" title="log4j" >log4j</a> pour gérer l&#8217;audit.</p><p>Nous encapsulerons tout de même le logger avec une couche légère <em>packagée</em> dans la librairie <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="Xebia Spring Security Extras" >Xebia Spring Security Extras</a> qui ajoutera au message l&#8217;identité de l&#8217;internaute et son adresse IP (via <a
href="http://static.springsource.org/spring-security/site/" title="Spring Security" >Spring Security</a>). Cette librairie offre une gestion déclarative de l&#8217;audit avec une annotation <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/Audited.java">@Audited</a></code>, son aspect associé <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/ee0fd5095d854f6c0e75fba21b6a9c697be56b02/src/main/java/fr/xebia/audit/AuditAspect.java">AuditAspect</a></code> et une classe utilitaire <code><a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java">Auditor</a></code>. Nous ne rentrerons pas dans le débat annotations vs. code ; dans la majeure partie des projets, nous avons pu traiter la plupart de l&#8217;audit avec une annotation et seuls quelques cas ont nécessité de passer par du code.</p><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: java; title: ; notranslate">
@Audited(message = &quot;transferMoney(#{args[0].accountNumber}, #{args[1].accountNumber}, #{args[3]})&quot;)
public void transferMoney(Account from, Account to, Amount amount) throws BusinessException { ... }
</pre><p>L&#8217;attribut <code>message</code> est un pattern supportant <a
href="http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07.html" title="Spring Expression Language" >Spring Expression Language</a> définissant l&#8217;entrée insérée dans le fichier d&#8217;audit ; la date, le nom de l&#8217;utilisateur, l&#8217;adresse ip et l&#8217;exception s&#8217;il y en a une sont ajoutés au message.</p><p><strong>Fragment de configuration Spring Framework pour utiliser l&#8217;annotation <code>@Audited</code> :</strong></p><pre class="brush: xml; title: ; notranslate">
&lt;beans ...
   xmlns:security-extras=&quot;http://www.xebia.fr/schema/xebia-spring-security-extras&quot;
   xsi:schemaLocation=&quot;...
        http://www.xebia.fr/schema/xebia-spring-security-extras http://www.xebia.fr/schema/security/xebia-spring-security-extras.xsd&quot;&gt;
   &lt;!-- enable Spring AOP --&gt;
   &lt;aop:aspectj-autoproxy/&gt;
  &lt;!-- activate the AutitAspect --&gt;
  &lt;security-extras:audit-aspect /&gt;
   ...
&lt;/beans&gt;
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... transferMoney(000652584515, 0000684651684, 187.53) by bdupont coming from 192.168.0.14
... transferMoney(000652584515, 0000684651684, 666666.00) threw '...BusinessException: debit amount greater than account balance'
   by bdupont coming from 192.168.0.14
</pre><p><strong>Exemple de gestion de l&#8217;audit avec l&#8217;utilitaire <a
href="https://github.com/xebia-france/xebia-spring-security-extras/blob/e0edfe60f4fc85dac0c184b3b9d57d34b98795b3/src/main/java/fr/xebia/audit/Auditor.java" title="Auditor" ><code>Auditor</code></a> :</strong></p><pre class="brush: java; title: ; notranslate">
public void transferMoney(...) throws BusinessException {
   ...
   Auditor.audit(&quot;Tranfer '&quot; + amount + &quot;' from &quot; + fromAccount + &quot; to &quot; + toAccount);
}
</pre><p><strong>Message d&#8217;audit généré :</strong></p><pre class="brush: java; title: ; notranslate">
... Transfer '187.53 euros' from Account[000652584515] to Account[0000684651684] by bdupont coming from 192.168.0.14
</pre><p>L&#8217;entrée d&#8217;audit est ajoutée dans un fichier d&#8217;audit géré par le logger spécifique <code>"fr.xebia.audit"</code> (<a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="voir cet article" >voir cet article</a> pour la configuration du logger).</p><p>Tous les détails sur l&#8217;annotation <code>@Audited</code> sont sur <a
href="https://github.com/xebia-france/xebia-spring-security-extras/wiki/AuditedAnnotation">@Audited Annotation</a>.</p><h4><a
name="Intgrationduframeworkdansuneap"></a>Intégration du framework dans une application</h4><p>Ce framework peut être intégré de différentes façons dans une application :</p><ul><li>Intégration Maven :<pre class="brush: xml; title: ; notranslate">
&lt;project ...&gt;
   &lt;dependencies&gt;
      &lt;dependency&gt;
         &lt;groupId&gt;fr.xebia.springframework&lt;/groupId&gt;
         &lt;artifactId&gt;xebia-spring-security-extras&lt;/artifactId&gt;
         &lt;version&gt;1.1.6&lt;/version&gt;
      &lt;/dependency&gt;
      ...
   &lt;/dependencies&gt;
   ...
&lt;/project&gt;
</pre><p>Cet artifact est déployé sur le <a
href="http://repo1.maven.org/maven2/">Maven Central Repository</a>.</li><li>Téléchargement du jar <a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6.jar" title="xebia-spring-security-extras-1.1.6.jar" >xebia-spring-security-extras-1.1.6.jar</a> (<a
href="http://repo1.maven.org/maven2/fr/xebia/springframework/xebia-spring-security-extras/1.1.6/xebia-spring-security-extras-1.1.6-sources.jar" title="sources" >sources</a>).</li><li>En récupérant le code source disponible sous licence Open Source <a
href="http://www.apache.org/licenses/LICENSE-2.0" title="Apache Software Licence 2" >Apache Software Licence 2</a> dans le repository GitHub <a
href="https://github.com/xebia-france/xebia-spring-security-extras" title="GitHub xebia-france xebia-spring-security-extras" >https://github.com/xebia-france/xebia-spring-security-extras</a>.</li></ul><h3><a
name="Stockagefichiertextevsbasededo"></a>Stockage : fichier texte vs. base de données</h3><p>Le stockage des entrées d&#8217;audit en base de données permet sûrement une recherche plus fine des données que sur des fichiers mais cela ajoute de la complexité (déploiement, exploitation, backup) ainsi que des risques de pannes et impacte les performances. Les approches JMS présentent des contraintes similaires et l&#8217;utilisation de systèmes de logs distants comme <a
href="http://en.wikipedia.org/wiki/Rsyslog" title="rsyslog" >rsyslog</a> présentent un défi de fiabilité. Ces difficultés sont accentuées lorsqu&#8217;une application génère de gros volumes de logs (plusieurs Go/jour).</p><p><strong>Pour ces raisons, nous préférons stocker les messages d&#8217;audit dans un simple fichier.</strong> Les risques de saturation du système de fichiers sont <em>assez facilement</em> gérables par les équipes d&#8217;exploitation, les procédures d&#8217;archivage et de consultation très simples (<code>gzip</code>, <code>scp</code>, <code>grep</code>, etc) et il n&#8217;y a quasiment jamais de problème de performance, même avec des fichiers de quelques Go par jour.</p><p>Y-a-t-il un plus grand risque de perdre les données par de mauvaises manipulations ? Si une application est critique, les exploitants doivent déjà ne pas perdre les fichiers de log du système d&#8217;exploitation, des serveurs web et autres firewalls.</p><p>Pour la gestion des messages d&#8217;audit sous forme de fichier texte, nous aimons logback comme nous l&#8217;avons expliqué dans <a
href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/" title="Java en Production  Les fichiers de logs" >Java en Production &#8211; Les fichiers de logs</a> mais il est aussi possible d&#8217;utiliser Log4j.</p><p>Exemple de configuration Logback pour gérer les messages d&#8217;audit émis sur le logger <code>fr.xebia.audit</code> :</p><pre class="brush: xml; title: ; notranslate">
&lt;appender name=&quot;audit-file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
   &lt;file&gt;${LOGS_FOLDER}/my-application-audit.log&lt;/file&gt;
   &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
      &lt;!-- rotate every day --&gt;
      &lt;fileNamePattern&gt;/my-application-audit.%d{yyyyMMdd-HHmm}.log.zip&lt;/fileNamePattern&gt;
   &lt;/rollingPolicy&gt;
   &lt;encoder&gt;
      &lt;!-- don't output the date or the logger name because the auditing framework handles this --&gt;
      &lt;pattern&gt;%m %throwable{0}%n&lt;/pattern&gt;
   &lt;/encoder&gt;
&lt;/appender&gt;
&lt;!-- route the 'fr.xebia.audit' log messages to the audit-file --&gt;
&lt;logger name=&quot;fr.xebia.audit&quot; additivity=&quot;false&quot; level=&quot;TRACE&quot;&gt;
   &lt;appender-ref ref=&quot;audit-file&quot; /&gt;
&lt;/logger&gt;
</pre><p>Exemple équivalent avec log4j (le <code>EnhancedPatternLayout</code> requiert log4j 1.2.16) :</p><pre class="brush: java; title: ; notranslate">
log4j.appender.auditfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.auditfile.datePattern='-'yyyyMMdd
log4j.appender.auditfile.file=${catalina.base}/logs/my-application-audit.log
log4j.appender.auditfile.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.auditfile.layout.conversionPattern=%m %throwable{short}n
log4j.logger.fr.xebia.audit=INFO, auditfile
</pre><h3><a
name="Quefairedeslogsdauditaprslesav"></a>Que faire des logs d&#8217;audit après les avoir générées ?</h3><p>Nous ne rentrerons pas plus dans les détails de la gestion des logs d&#8217;audit après leur génération par nos applications.</p><p>Ce sujet complexe présente aussi bien des aspects juridiques que de confidentialité ou encore de fiabilité. Schématiquement, on n&#8217;a pas le droit de garder indéfiniment des données personnelles, il faut restreindre leur consultation et empêcher leur modification et leur destruction par accident comme par malveillance.</p><p>Des professionnels de l&#8217;exploitation et de la sécurité sont beaucoup plus compétents que nous sur ce sujet <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><h3><a
name="Pourallerplusloin"></a>Pour aller plus loin</h3><p>Si le traitement de l&#8217;audit dans les applications vous a intéressé, nous avons aimé lire :</p><ul><li><a
href="http://itmanagement.earthweb.com/columns/article.php/3578916/The-Importance-of-Audit-Logs.htm" title="The Importance of Audit Logs" >The Importance of Audit Logs</a> par George Spafford,</li><li><a
href="http://www.slideshare.net/anton_chuvakin/nist-80092-log-management-guide-in-the-real-world" title="NIST 800-92 Log Management Guide in the Real World" >NIST 800-92 Log Management Guide in the Real World</a> et <a
href="http://www.slideshare.net/anton_chuvakin/presentations" title="lensemble des prsentations" >l&#8217;ensemble des présentations</a> de Anton Chukavin.</li></ul><h3><a
name="Synthse"></a>Synthèse</h3><p>Nous avons vu aujourd&#8217;hui une façon simple de gérer l&#8217;audit d&#8217;applications java en reposant sur le framework de log de l&#8217;application (Logback voire Log4j) pour écrire les messages dans de simples fichiers texte avec une surcouche très légère composée d&#8217;une annotation <code>@Audited</code> et d&#8217;un utilitaire <code>Auditor</code>.</p><p><strong>Historique</strong><br
/> 25/11/2010 : passage à la version 1.1.5 de la librarie xebia-spring-security-extras avec utilisation du namespace de configuration.<br
/> 20/12/2011 : xebia-spring-security-extras : passage à la version 1.1.6 et aux URLs GitHub</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2010/08/25/java-en-production-laudit/feed/</wfw:commentRss> <slash:comments>16</slash:comments> </item> <item><title>Servlet 3.0, les 3 points marquants</title><link>http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/</link> <comments>http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/#comments</comments> <pubDate>Tue, 15 Sep 2009 22:21:16 +0000</pubDate> <dc:creator>Erwan Alliaume</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[Comet]]></category> <category><![CDATA[Java EE 6]]></category> <category><![CDATA[Servlet 3.0]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2854</guid> <description><![CDATA[Servlet 3.0 est une révision importante des spécifications, elle apporte son lot de nouveautés : simplification, pluggabilité, support de l&#8217;asynchrone, sécurité et d&#8217;autres modifications mineures. Cette JSR, passée en final draft en mai denier, fera partie des nouveautés apportées par Java EE 6 dont la sortie ne devrait pas tarder. Mais que se cache t-il [...]]]></description> <content:encoded><![CDATA[<p>Servlet 3.0 est une révision importante des <a
href="http://jcp.org/en/jsr/detail?id=315" title="spécifications" >spécifications</a>, elle apporte son lot de nouveautés : simplification, pluggabilité, support de l&#8217;asynchrone, sécurité et d&#8217;autres modifications mineures. Cette JSR, passée en <em>final draft</em> en mai denier, fera partie des nouveautés apportées par <a
href="http://jcp.org/en/jsr/detail?id=316" title="Java EE 6" >Java EE 6</a> dont la sortie ne devrait pas tarder. Mais que se cache t-il derrière cette nouvelle version ? Simple dépoussiérage après 161 JSR d&#8217;écart depuis la dernière <a
href="http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index.html" title="version 25" >version 2.5</a> ou véritables avancées ? C&#8217;est la question à laquelle nous allons essayer de répondre au cours de cet article en nous focalisant sur les 3 points marquants de cette nouvelle version :</p><ul><li>La <a
href="http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/#Laconfigurationviaannotationsc">configuration via annotations</a>, parce que c&#8217;est tendance</li><li>Les <a
href="http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/#LesWebFragmentsunbonmoyendemod">Web Fragments</a>, un bon moyen de modulariser</li><li>L&#8217;<a
href="http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/#Lexcutionasynchronepourlesarch">exécution asynchrone</a>, pour les architectures Comet</li></ul><h3><a
name="Laconfigurationviaannotationsc"></a>La configuration via annotations, c&#8217;est tendance</h3><p>L&#8217;épidémie continue ! Je ne parle pas de la fameuse grippe qui circule en ce moment &#8230; mais des annotations. C&#8217;est la première nouveauté que je voulais mettre en avant concernant les Servlets 3.0. Dorénavant, vous pourrez configurer vos Servlets, Filtres et autres ContextListeners via des annotations spécifiques. Vous en êtes fan ? Tant mieux. Pour ma part, je n&#8217;utilise directement les servlets que très rarement, ce n&#8217;est donc pas cette nouveauté qui m&#8217;intéresse le plus. Pour avoir déjà eu cette discussion avec des collègues, cette réponse engendre rapidement des exclamations du type : « Tout le monde ne fait pas que du Spring !». Et pourtant, c&#8217;est un fait : cela fait bon nombre d&#8217;années que je n&#8217;ai pas eu besoin de créer de servlets, Spring ou non. Et vous, quels usages en faites vous ?<br
/> D&#8217;autre part, de manière générale, il ne faut pas dénigrer les bons vieux fichiers XML. S&#8217;ils peuvent paraître lourds et verbeux, ils ont l&#8217;avantage de centraliser les différentes déclarations et configurations à un seul endroit. Il ne me semble d&#8217;ailleurs pas complètement burlesque de découpler un mapping de son objet cible : les annotations sont avant tout destinées à des méta-données statiques.</p><p>Cet aparté mis à part, revenons au cœur du sujet : les annotations disponibles dans Servlet 3.0 :</p><ul><li><strong>@WebServlet</strong>, permet de marquer une classe comme servlet. Cette classe doit toujours étendre HttpServlet</li></ul><pre class="brush: java; title: ; notranslate">
@WebServlet(name=&quot;simpleservlet&quot;, urlPatterns=&quot;/myservlet&quot;, &quot;/simpleservlet&quot;})
public class SimpleServlet extends HttpServlet { ... }
</pre><ul><li><strong>@WebFilter</strong>, de la même manière, cette annotation permet de déclarer un Filtre</li></ul><pre class="brush: java; title: ; notranslate">
@WebFilter(urlPatterns={&quot;/mufilter&quot;,&quot;/simplefilter&quot;})
public class SimpleFilter implements Filter { ... }
</pre><ul><li><strong>@WebInitParam</strong>, cette annotation est utilisée pour préciser des paramètres d&#8217;initialisation aux Servlets ou aux Filtres</li></ul><pre class="brush: java; title: ; notranslate">
@WebServlet(name=&quot;simpleservlet&quot;, urlPatterns=&quot;/myservlet&quot;, &quot;/simpleservlet&quot;}, initParams={
    @WebInitParam(name=&quot;param1&quot;, value=&quot;value1&quot;),
    @WebInitParam(name=&quot;param2&quot;, value=&quot;value2&quot;)
})
public class MyServlet extends HttpServlet { ... }
</pre><ul><li><strong>@WebListener</strong>, permet d&#8217;annoter un ContextListener pour vous permettre de recevoir certains événements de la WebApp</li></ul><pre class="brush: java; title: ; notranslate">
@WebListener
public class MyListener implements ServletContextListener { ... }
</pre><ul><li><strong>@MultipartConfig</strong>, sur une Servlet, cette annotation indique que la requête attendue est du type <em>mime/multipart</em> et son contenu est rendu directement disponible par l&#8217;intermédiaire de la méthode <code>request.getParts()</code> &#8230; enfin ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></li></ul><p>Vous l&#8217;avez compris, avec l&#8217;introduction des annotations, le descripteur de déploiement <em>web.xml</em> devient optionnel. La configuration est simplifiée, c&#8217;était le but recherché, mais rien de révolutionnaire dans cette fonctionnalité.</p><p>Outre les annotations, les <a
href="http://jcp.org/en/jsr/detail?id=315" title="spcifications" >spécifications</a> fournissent un autre nouveau moyen d&#8217;ajouter des Servlets et Filtres. Une API permet la configuration dynamique au Runtime lors des différents évènements récupérés par le ContextListener. Pour quoi faire ? Pour permettre aux Frameworks de s&#8217;initialiser dynamiquement à partir de fichier de configuration ? Dans les faits, l&#8217;intérêt est limité puisque l&#8217;ajout de Servlet passe par l&#8217;intermédiaire d&#8217;un simple nom de classe (qui sera chargé par un Class.forName() ). Il vous sera donc difficile de passer des valeurs dynamiques à celle-ci avant son initialisation. Du coup, on perd l&#8217;intérêt d&#8217;un tel mécanisme.</p><pre class="brush: java; title: ; notranslate">
context.addServlet(&quot;name&quot;, &quot;description&quot;, &quot;fr.xebia.web.servlet.SimpleServlet&quot;, initParams, -1, false);
context.addServletMapping(&quot;name&quot;, urlPatterns);
context.addFilter(&quot;filterName&quot;, &quot;description&quot;, &quot;fr.xebia.web.filter.SimpleFilter&quot;, initParams, false);
</pre><h3><a
name="LesWebFragmentsunbonmoyendemod"></a>Les Web Fragments, un bon moyen de modulariser</h3><p>Les web fragments fournissent un moyen simple de partitionner logiquement le descripteur de déploiement (web.xml). Ainsi, différents frameworks (Struts, JSF &#8230;) pourront fournir par ce biais une configuration Web par défaut directement depuis leur Jar. Ils faciliteront et masqueront ainsi au maximum leur configuration à leurs utilisateurs.</p><p>La déclaration d&#8217;un fragment est simple. Il s&#8217;agit d&#8217;un fichier XML conventionné qui doit :</p><ul><li>se nommer <em>web-fragment.xml</em></li><li>être placé dans le répertoire META-INF d&#8217;un Jar</li><li>avoir comme élément racine du XML une balise <code>&lt;web-fragment&gt;</code></li></ul><p>Pendant le déploiement,  le conteneur est responsable de scanner, découvrir et traiter les différents fragments répondant à ces critères.</p><pre class="brush: java; title: ; notranslate">
&lt; !-- Exemple de web-fragment.xml --&gt;
&lt;web-fragment&gt;
  &lt;name&gt;XebiaCustomFragment&lt;/name&gt;
  &lt;listener&gt;
    &lt;listener-class&gt; fr.xebia.web.servlet.CustomListenerInFragment&lt;/listener-class&gt;
  &lt;/listener&gt;
  &lt;servlet&gt;
    &lt;servlet-name&gt;CutomServletInFragment&lt;/servlet-name&gt;
    &lt;servlet-class&gt;fr.xebia.web.servlet.CutomServletInFragment&lt;/servlet-class&gt;
  &lt;/servlet&gt;
&lt;/web-fragment&gt;
</pre><p>Il vous est possible de nommer vos fragments par l&#8217;intermédiaire d&#8217;une balise spécifique <code>&lt;name /&gt;</code>. Cette balise vous permet de contrôler qu&#8217;un fragment ne soit chargé qu&#8217;une seule et unique fois. D&#8217;autres balises : <code>&lt;absolute-ordering /&gt;</code>, <code>&lt;ordering /&gt;</code>, <code>&lt;before /&gt;</code>, <code>&lt;after /&gt;</code>, <code>&lt;others /&gt;</code> permettent de contrôler l&#8217;ordre de déclaration des différents fragments.</p><pre class="brush: java; title: ; notranslate">
&lt;web-fragment&gt;
  &lt;name&gt;XebiaCustomFragment2&lt;/name&gt;
  &lt;ordering&gt;&lt;after&gt;XebiaCustomFragment&lt;/after&gt;&lt;/ordering&gt;
  ...
&lt;/web-fragment&gt;
</pre><p>Il y a fort à parier que les frameworks web stars adopteront rapidement cette nouveauté pour faciliter la vie de leurs utilisateurs. Les tambouilles internes de configuration se feront plus discrètes tout en accentuant la modularité de vos projets. Pourtant ces fragments seront-ils d&#8217;une réelle utilité ? Pour ma part, je pense que cette fonctionnalité est une belle avancée. Elle incite les développeurs à regrouper leur code et configuration dans un même endroit. Il s&#8217;agit donc, si on peut dire, d&#8217;une première étape vers un développement modulaire.</p><h3><a
name="Lexcutionasynchronepourlesarch"></a>L&#8217;exécution asynchrone, pour les architectures Comet</h3><p>Je vous ai gardé le meilleur pour la fin, c&#8217;est à mon avis la nouvelle fonctionnalité la plus remarquable : l&#8217;ajout de l&#8217;exécution asynchrone. Jusqu&#8217;à présent, lorsqu&#8217;un utilisateur appelait une servlet, il n&#8217;avait d&#8217;autre choix que d&#8217;attendre la fin du traitement avant de pouvoir reprendre la main : l&#8217;exécution d&#8217;une Servlet était synchrone. Ce comportement était-il désiré ou subi ? Probablement un peu des deux. Lorsque vous vouliez lancer un traitement et rendre la main rapidement à vos utilisateurs, vous deviez gérer par vous-même le fonctionnement asynchrone : pools de threads, files d&#8217;attente, listeners &#8230; bref, le début des galères. À quoi bon garder cette glue technique pour un besoin aussi simple que récurrent ?</p><p>Servlet 3.0 vous propose donc un mécanisme d&#8217;exécution asynchrone vous permettant de simplifier ce code à son strict minimum. Configuré dynamiquement par le code <code>request.startAsync()</code> ou via les propriétés <code>asyncSupported</code> et <code>asyncTimeOut</code> des annotations présentées précédemment, il est possible de rendre le traitement d&#8217;une requête asynchrone, avec si besoin, un timeout. Pour cela, une nouvelle API permet de suspendre et de reprendre le traitement d&#8217;une requête en cours d&#8217;exécution et d&#8217;activer ou non la réponse en fonction des besoins de l&#8217;application. Il est également possible d&#8217;ajouter des <em>listeners</em> qui recevront les notifications de fin de traitement ou de timeout. Ce nouveau mécanisme vous sera particulièrement utile si vous désirez mettre en place une <a
href="http://en.wikipedia.org/wiki/Comet_(programming)" title="architecture du type Comet" >architecture du type Comet</a> dont la caractéristique principale est de laisser ouvert le plus longtemps possible un canal de communication  entre le client et le serveur (dans l&#8217;attente de nouveautés sur le serveur).</p><pre class="brush: java; title: ; notranslate">
@WebServlet(&quot;/servletAsync&quot;, asyncSupported=true)
public class MyServlet extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response) {
     // Ajouter un listener
    request.addAsyncListener(new MyAsyncListener())
    // Definition du timeout programatiquement
    request.setAsyncTimeout(10000);
     // Execution asynchrone et récupération du context
     AsyncContext context = request.startAsync(request, response);
   }
}
</pre><div
align="center"> <a
href="http://twitter.com/ealliaume"    ><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png"     alt="twitter erwan alliaume" title="twitter erwan alliaume" border="0" /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/09/15/servlet-3-0-les-3-points-marquants/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Google Guice : Injection avancée</title><link>http://blog.xebia.fr/2009/06/19/google-guice-injection-avancee/</link> <comments>http://blog.xebia.fr/2009/06/19/google-guice-injection-avancee/#comments</comments> <pubDate>Fri, 19 Jun 2009 07:41:47 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[dépendances]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[IoC]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=2268</guid> <description><![CDATA[Dans le cadre d&#8217;un article d&#8217;introduction à Guice, nous avions vu une injection de dépendance simple, répondant à un besoin relativement basique. Dans ce second article, nous allons découvrir des outils d&#8217;injection plus évolués, qui devraient nous permettre de réaliser par la suite notre premier exemple &#8216;réel&#8217; d&#8217;implémentation Guice. Injection &#8216;nommée&#8217; Reprenons l&#8217;exemple simple utilisé [...]]]></description> <content:encoded><![CDATA[<p>Dans le cadre d&#8217;<a
href="http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/" title="un article dintroduction  Guice" >un article d&#8217;introduction à Guice</a>, nous avions vu une injection de dépendance simple, répondant à un  besoin relativement basique.</p><p>Dans ce second article, nous allons découvrir des outils d&#8217;injection plus évolués, qui devraient nous permettre de réaliser par la suite notre premier exemple &#8216;réel&#8217; d&#8217;implémentation Guice.</p><h3><a
name="Injectionnomme"></a>Injection &#8216;nommée&#8217;</h3><p>Reprenons l&#8217;exemple simple utilisé dans l&#8217;article précédent pour en augmenter la difficulté.<br
/> Nous partons du postulat que notre DAO ne possède plus une seule, mais deux implémentations distinctes : <code>MyBasicDaoImpl</code>, précédemment utilisée, et <code>MyBasicDaoMock</code>, une nouvelle implémentation utilisant une base volatile.<br
/> Nous allons utiliser ces deux implémentations successivement dans notre service, et donc injecter deux implémentations différentes de la même interface dans notre service :</p><pre class="brush: java; title: ; notranslate">
@Override
public void displaySample() {
	try {
		recorder.append(&quot;Calling DAOn&quot;);
		String daoResult = basicDao.select();
		recorder.append(&quot;Result from DAO : &quot; + daoResult + &quot;n&quot;);
		recorder.append(&quot;Calling memory DAOn&quot;);
		daoResult = memoryDao.select();
		recorder.append(&quot;Result from memory DAO : &quot; + daoResult + &quot;n&quot;);
	} catch (IOException e) {
		e.printStackTrace();
	}
}
</pre><p>Premier point à noter, pour notre DAO existant rien ne change, Guice utilisera la première implémentation déclarée pour résoudre la dépendance.<br
/> Pour notre seconde dépendance, nous utiliserons l&#8217;injection nommée.<br
/> Première solution, créer une annotation, <code>@Memory</code>, en utilisant la <code>BindingAnnotation</code> de Guice :</p><pre class="brush: java; title: ; notranslate">
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Memory {}
</pre><p>Il suffit alors d&#8217;annoter le constructeur du service :</p><pre class="brush: java; title: ; notranslate">
@Inject
public MyServiceImpl(MyBasicDao basicDao, @Memory MyBasicDao memoryDao) {
	super();
	this.basicDao = basicDao;
	this.memoryDao = memoryDao;
}
</pre><p>et d&#8217;annoter la déclaration de dépendance dans la classe <code>Module</code></p><pre class="brush: java; title: ; notranslate">
binder.bind(MyBasicDao.class).annotatedWith(Memory.class)
    .to(MyBasicDaoMemoryImpl.class);
</pre><p>Cette solution est relativement élégante, mais comporte le défaut de multiplier les classes d&#8217;annotation.<br
/> Le même résultat peut être atteint en utilisant une classe Guice permettant de nommer ses classes, mais sans créer d&#8217;annotation spécifique, à l&#8217;aide de l&#8217;annotation <code>@Named</code> et de la méthode <code>Names.named(String)</code><br
/> Le code ci-dessus est équivalent à :</p><pre class="brush: java; title: ; notranslate">
// Dans MyModule
binder.bind(MyBasicDao.class).annotatedWith(Names.named(&quot;Memory&quot;))
    .to(MyBasicDaoMemoryImpl.class);
// Dans MyServiceImpl
@Inject
public MyServiceImpl(MyBasicDao basicDao, @Named(&quot;Memory&quot;) MyBasicDao memoryDao) {
    ...
}
</pre><h3><a
name="Utiliserunedpendanceconditionn"></a>Utiliser une dépendance conditionnelle à l&#8217;aide de l&#8217;annotation @Provides</h3><p>Continuons à affiner notre injection de dépendance, en la conditionnant à des conditions runtime.<br
/> Imaginons que nous voulions injecter une implémentation de notre DAO en dépendant d&#8217;un paramètre runtime (nous nous baserons simplement sur un nombre aléatoire).<br
/> Pour cela, nous allons utiliser une méthode <code>@Provides</code> (à ne pas confondre avec les <code>Providers</code> de la version 1 de Guice).<br
/> Cette méthode doit être placée dans un module (où elle sera auto-découverte et retournera une instance de la classe injectée).</p><pre class="brush: java; title: ; notranslate">
// Dans MyModule
/**
 * Provides method
 */
@Provides
@Inject
private @Named(&quot;Random&quot;)
MyBasicDao provideRandomDao(MyBasicDao basicDao,
		@Named(&quot;Memory&quot;) MyBasicDao memoryDao) {
	if (RandomUtils.randomBoolean()) {
		return basicDao;
	}
	return memoryDao;
}
</pre><p>On peut noter que cette méthode peut elle-même être injectée (avec les instances de Dao précédemment utilisées).</p><h3><a
name="Conclusion"></a>Conclusion</h3><p>Nous avons maintenant une certaine souplesse dans l&#8217;injection, qui va nous permettre d&#8217;aborder dans un prochain billet un exemple plus concret.<br
/> À noter que durant la rédaction de ce billet, <a
href="http://code.google.com/p/google-guice/" title="la version 20 de Google Guice" >la version 2.0 de Google Guice</a> a été officiellement releasée, et que les prochains billets se baseront sur cette version stable.</p><p><a
href="http://code.google.com/p/xebia-france/source/browse/google-guice/hands-on/tags/1.2/" title="Tlchargez le projet Eclipse sur le Google Code de Xebia" >Téléchargez le projet Eclipse sur le Google Code de Xebia</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/06/19/google-guice-injection-avancee/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/</link> <comments>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#comments</comments> <pubDate>Mon, 11 May 2009 16:48:58 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[@Inject]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[Datagrid]]></category> <category><![CDATA[ESB]]></category> <category><![CDATA[Fuji]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[JavaFX]]></category> <category><![CDATA[JSon]]></category> <category><![CDATA[JSR-299]]></category> <category><![CDATA[OpenESB]]></category> <category><![CDATA[Paris JUG]]></category> <category><![CDATA[RIA]]></category> <category><![CDATA[SOA]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <category><![CDATA[Tapestry]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1985</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. SOA Fuji, le futur d&#8217;OpenESB Le coin de la technique Concevoir des APIs efficaces JavaFX : informations et controverses Sortie de Wicket 1.3.6 @Inject standardisation de l’injection de dépendances Sortie de Tapestry 5.1 Trucs et astuces Json &#8211; Restfull Evènements de notre communauté en [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>SOA</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#FujilefuturdOpenESB">Fuji, le futur d&#8217;OpenESB</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#ConcevoirdesAPIsefficaces">Concevoir des APIs efficaces</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#JavaFXinformationsetcontrovers">JavaFX : informations et controverses</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SortiedeWicket">Sortie de Wicket 1.3.6</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#Inject">@Inject standardisation de l’injection de dépendances</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SortiedeTapestry">Sortie de Tapestry 5.1</a></li><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#TrucsetastucesJsonRestfull">Trucs et astuces Json &#8211; Restfull</a></li></ul><p><strong>Evènements de notre communauté en France et à l&#8217;étranger</strong></p><ul><li><a
href="http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/#SoireDatagridauParisJug">Soirée Datagrid au Paris Jug</a></li></ul><h3><a
name="SOA"></a>SOA</h3><h4><a
name="FujilefuturdOpenESB"></a>Fuji, le futur d&#8217;OpenESB</h4><p>La prochaine version d&#8217;OpenESB, qui sera estampillée &#8216;v3&#8242;, est en cours de développement sous le nom de code &#8216;Project Fuji&#8217;. Ce projet a été récemment mis en avant par Andi Egloff, dans <a
href="http://www.java-tv.com/2009/05/07/fuji-the-next-generation-of-openesb/" title="un webcast" >un webcast</a> qui fait le tour des nombreuses nouveautés. Les principales d&#8217;entre elles sont :</p><ul><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=IntegrationFlowLanguageOverview" title="Integration Flow Language (IFL)" >Integration Flow Language (IFL)</a> : il s&#8217;agit d&#8217;un <a
href="http://martinfowler.com/bliki/DomainSpecificLanguage.html" title="DSL externe" >DSL externe</a> permettant de définir des flux d&#8217;intégrations. Le rôle de ce langage est donc le même que le DSL interne offert par Apache Camel.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiDJBI" title="Distributed JBI" >Distributed JBI</a> : La spécification JBI (<a
href="http://www.jcp.org/en/jsr/detail?id=208" title="JSR208" >JSR-208</a>) ne couvre pas la problématique de distribution des composants JBI sur plusieurs noeuds. Fuji apporte une extension propriétaire pour permettre cette distribution.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiRunningOJCComponentsOSGi" title="Utilisation de composants OpenJBI" >Utilisation de composants OpenJBI</a> : ces composants seront utilisables directement dans OpenESB v3. Le projet prévoit de mettre les composants dont la compatibilité aura été validée dans le <em>repository</em> Maven du projet.</li><li><a
href="http://wiki.open-esb.java.net/Wiki.jsp?page=FujiEIP" title="Enterprise Integration Patterns" >Enterprise Integration Patterns</a> : un certain nombre d&#8217;EIP sera supporté en standard et configurable via le langage IFL.</li></ul><p>La version finale d&#8217;OpenESB v3 est prévue pour le second semestre 2009, l&#8217;équipe du projet annonce une probable <em>preview</em> pour JavaOne en juin.</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="ConcevoirdesAPIsefficaces"></a>Concevoir des APIs efficaces</h4><p>John De Goes vient de publier une série de deux articles (<a
href="http://jdegoes.squarespace.com/journal/2009/5/2/good-api-design-part-1.html" title="première partie" >première partie</a> et <a
href="http://jdegoes.squarespace.com/journal/2009/5/6/good-api-design-part-2.html" title="deuxime partie" >deuxième partie</a>) portant sur les bonnes pratiques de conception d&#8217;APIs. Il s&#8217;appuie sur un exemple d&#8217;API de configuration pour illustrer son propos. Les points qu&#8217;il met particulièrement en avant sont :</p><ul><li>Il est important de sélectionner le niveau d&#8217;abstraction approprié et d&#8217;assurer l&#8217;uniformité de celui-ci sur l&#8217;ensemble de l&#8217;API, ainsi que de définir et respecter une responsabilité pour chaque classe. Ceci concerne la granularité des méthodes, le type d&#8217;objets manipulés en entrée et en sortie, ainsi que la présence et le type d&#8217;exception éventuellement renvoyée.</li><li>N&#8217;offrir qu&#8217;une seule possibilité pour chaque besoin, afin d&#8217;éviter la confusion chez l&#8217;utilisateur de cette API.</li><li>S&#8217;appuyer sur les possibilités offertes par le langage pour empêcher certaines mauvaises utilisations d&#8217;une API.</li><li>L&#8217;API doit être la plus intuitive possible afin de minimiser autant que possible le besoin pour l&#8217;utilisateur d&#8217;avoir à se plonger dans une documentation.</li></ul><p>Certaines de ces idées sont déjà partagées par de nombreux développeurs, mais comme c&#8217;est souvent le cas dans l&#8217;énonciation de bonnes pratiques ou de <em>patterns</em>, tout l&#8217;intérêt réside ici dans la formalisation apportée par l&#8217;auteur.</p><p>Les lecteurs intéressés par cette problématique pourront se tourner vers le livre de Jaroslav Tulach, <a
href="http://apress.com/book/view/1430209739" title="Practical API Design" >Practical API Design</a>, qui apporte l&#8217;intéressant retour d&#8217;expérience d&#8217;un architecte de NetBeans, ou encore <a
href="http://lcsd05.cs.tamu.edu/slides/keynote.pdf" title="How to Design a Good API and Why it Matters" >How to Design a Good API and Why it Matters</a> par Joshua Bloch (auteur de <a
href="http://java.sun.com/docs/books/effective/" title="Effective Java" >Effective Java</a>).</p><h4><a
name="JavaFXinformationsetcontrovers"></a>JavaFX : informations et controverses</h4><p>Depuis plusieurs mois, nous vous rapportons les différentes <a
href="http://blog.xebia.fr/2009/02/16/revue-de-presse-xebia-96/#JavaFxsurmobile" title="informations" >informations</a> et <a
href="http://blog.xebia.fr/2009/03/09/revue-de-presse-xebia-99/#LepositionnementdeJavaFXtoujou" title="controverses" >controverses</a> à propos de JavaFX. Cette technologie RIA, développée par Sun, et introduite en décembre 2008 fait beaucoup parler d&#8217;elle car personne ne sait dire aujourd&#8217;hui ce qu&#8217;il adviendra de JavaFX dans les mois et années à venir.</p><p>Les propos particulièrement négatifs dont JavaFX a été victime à ses débuts se font moins nombreux, non pas parce que cette technologie a convaincu, mais parce qu&#8217;elle n&#8217;est plus au centre des débats. En fait, ceci est bénéfique puisque cela permet d&#8217;observer plus sereinement les différents exemples postés régulièrement par la communauté JavaFX naissante. Il ressort de ce tour d&#8217;horizon que les capacités actuelles de JavaFX ne prêtent pas à critique : les fonctionnalités de graphisme et d&#8217;animations qui sont offertes <a
href="http://java.dzone.com/articles/javafx-im-starting-believe" title="semblent satisfaire" >semblent satisfaire</a> de nombreux développeurs. Le problème porte principalement sur les manques et les promesses non tenues à ce jour :</p><ul><li>la portabilité de JavaFX sur plusieurs environnements (_desktop_, web, mobile, et TV, le fameux &#8216;<em>All the screens of your life</em>&#8216;) n&#8217;est pas assuré puisque le déploiement est impossible sur mobile, faute de <em>device</em> compatible. Le fonctionnement sur téléviseur est lui toujours prévu dans une version ultérieure.</li><li>les composants graphiques de haut niveau sont absents. Il s&#8217;agit pourtant d&#8217;un élément indispensable pour le développement d&#8217;applications RIA.</li></ul><p>Joshua Marinacci, un des meneurs de JavaFX chez Sun, a été interviewé par Scott Hanselman <a
href="http://www.hanselminutes.com/default.aspx?showID=178" title="dans un podcast" >dans un podcast</a>. Il annonce que la démonstration de JavaFX sur TV <em>pourrait</em> être faite lors de JavaOne 2009, en juin. Il reconnaît par ailleurs le marketing excessif entourant cette technologie.</p><p>Outre ces réflexions d&#8217;ordre technique, le rachat de Sun par Oracle constitue une autre source de débats. Personne ne sait quelle décision Oracle prendra quant à JavaFX : soutenir ce projet qui nécessite encore un investissement lourd pour prétendre réellement concurrencer les autres acteurs RIA ou abandonner ce marché. Les différentes opinions sur ce sujet sont présentées et argumentées dans <a
href="http://lescastcodeurs.com/2009/05/les-cast-codeurs-podcast-episode-3/" title="le dernier podcast" >le dernier podcast</a> des Cast Codeurs.</p><h4><a
name="SortiedeWicket"></a>Sortie de Wicket 1.3.6</h4><p><a
href="http://wicket.apache.org/" title="Wicket" >Wicket</a>, le framework orienté composant de la <em>Fondation Apache</em>, sort en version <a
href="http://wicket.apache.org/news.html#News-wicket1.3.6" title="1.3.6" >1.3.6</a> (1.4 toujours en <a
href="http://www.apache.org/dyn/closer.cgi/wicket/1.4-rc2" title="release candidate 2" >release candidate 2</a>).</p><p>Malgré les 7 mois d&#8217;écart avec la version précédente, il ne faut pas s&#8217;attendre à une révolution pour cette nouvelle mouture. Il s&#8217;agit en effet d&#8217;une version de stabilisation et d&#8217;amélioration. On notera donc de nombreux <a
href="http://wicket.apache.org/news.html#News-Bug" title="correctifs de bugs" >correctifs de bugs</a> et <a
href="http://wicket.apache.org/news.html#News-Improvement" title="plusieurs amliorations" >plusieurs améliorations</a>.</p><p>Cette version est téléchargeable sur le <a
href="http://www.apache.org/dyn/closer.cgi/wicket/1.3.6" title="site dApache" >site d&#8217;Apache</a> ou en changeant votre version de <em>pom.xml</em> en 1.3.6.</p><p>A noter, toujours autour de Wicket, le retour critique de <a
href="http://www.tomsquest.com" title="Tom's Quest" >Tom&#8217;s Quest</a> sur <a
href="http://www.tomsquest.com/blog/les-limites-de-wicket/" title="Wicket et ses limites" >Wicket et ses limites</a> après la présentation, chez Zenika, de Martin Dashorst, un des committers principaux de Wicket et coauteur du livre <a
href="http://wicketinaction.com/" title="Wicket In Action" >Wicket In Action</a>.</p><h4><a
name="Inject"></a>@Inject standardisation de l’injection de dépendances</h4><p>Pas mal de bruit la semaine dernière dans la blogosphère Java avec l&#8217;annonce par Google et <a
href="http://www.springsource.com/" title="SpringSource" >SpringSource</a> d&#8217;une nouvelle proposition de JSR dédiée à l&#8217;injection de dépendances : <a
href="http://code.google.com/p/atinject/" title="@Inject ("Annotations for Dependency Injection")" >@Inject (&laquo;&nbsp;Annotations for Dependency Injection&nbsp;&raquo;)</a>.<br
/> Comme le <a
href="http://google-code-updates.blogspot.com/2009/05/javaxinjectinject.html" title="souligne 'Crazy' Bob Lee" >souligne &#8216;Crazy&#8217; Bob Lee</a>, l&#8217;auteur principal de <a
href="http://code.google.com/p/google-guice/" title="Google Guice" >Google Guice</a>, la sortie de Spring 1.0, il y a déjà 5 ans, a apporté l&#8217;injection de dépendances aux masses, via un fichier de configuration propriétaire. Il y a 3 ans, Google Guice a proposé la même chose via des annotations (et SpringSource propose la même chose depuis Spring 2.5).<br
/> Si le succès de Google Guice est assez limité face au raz de marée Spring, le constat est là : il manque un standard. Comme les deux librairies ne sont pas compatibles, si vous exposez à un autre projet/équipe une librairie contenant des dépendances injectées par Google Guice, et que l&#8217;autre équipe utilise Spring, elle devra redéfinir tous les beans et leurs dépendances dans un fichier de configuration Spring (ou des annotations Spring).<br
/> @Inject propose donc de standardiser les annotations, afin de rendre portables sur différents frameworks (<a
href="http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/" title="Guice" >Guice</a>, Spring, <a
href="http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc" title="Tapestry IOC" >Tapestry IOC</a>, etc.) des classes injectables.</p><p><a
href="http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances" title="@Inject standardisation de l’injection de dépendances" >Lire notre article à ce sujet : @Inject standardisation de l’injection de dépendances</a>.</p><h4><a
name="SortiedeTapestry"></a>Sortie de Tapestry 5.1</h4><p>Tapestry, dont on parlait récemment dans l&#8217;article <a
href="http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc/" title="linjection de dpendances avec Tapestry IoC" >l&#8217;injection de dépendances avec Tapestry IoC</a>, passe en version 5.1 en respectant à la lettre son nouveau planning d&#8217;une version tout les 4 à 6 mois.<br
/> Outre les améliorations de performance et les nombreux bugs corrigés, la mise à jour embarque des nouveautés sur le support JavaScript, à la traîne par rapport au prédécesseur Tapestry 4.<br
/> Le rafraîchissement de plusieurs zones d&#8217;une page en une seule requête Ajax est maintenant supporté. Tapestry embarque maintenant la console JavaScript <a
href="http://www.gscottolson.com/blackbirdjs/" title="Blackbird" >Blackbird</a>.<br
/> Du côté des améliorations sur les templates, le chargement et le rendu des pages ont été optimisés, ce qui rend T5 plus rapide que jamais.<br
/> Vous pourrez aussi apprécier l&#8217;amélioration substantielle de l&#8217;archetype quickstart qui offre désormais une jolie interface, avec un design css intégré.<br
/> L&#8217;intégration de Spring est maintenant à double sens : on peut injecter des services Tapestry dans un Bean Spring.<br
/> Pour la prochaine version, qui sortira sans doute à la rentrée 2009, l&#8217;accent sera mis sur l&#8217;intégration de Spring Web Flow, et la possibilité d&#8217;utiliser une application Tapestry en tant que Portlet.</p><ul><li><a
href="http://tapestry.apache.org/tapestry5.1/release-notes.html" title="Release note" >Release note</a></li><li><a
href="http://tapestry.apache.org/tapestry5.1/" title="Site Maven du projet" >Site Maven du projet</a></li></ul><h4><a
name="TrucsetastucesJsonRestfull"></a>Trucs et astuces Json &#8211; Restfull</h4><p><a
href="http://www.linkedin.com/in/edwink" title="Edwin Khodabakchian" >Edwin Khodabakchian</a>, fondateur de Collaxa (aujourd&#8217;hui au coeur de la stratégie SOA d&#8217;Oracle), nous donne quelques <a
href="http://blog.feedly.com/2009/05/06/best-practices-for-building-json-rest-web-services/" title="bonnes pratiques pour crire des services web REST en utilisant Json" >bonnes pratiques pour écrire des services web REST en utilisant Json</a> (un couple qui a le vent en poupe). Actuellement lancé dans l&#8217;écriture de Feedly, une extension Firefox qui agrège des tweets et des entrés Google Reader, Edwin fera régulièrement profiter ses lecteurs de son expérience. Sans entrer dans les détails de ces bonnes pratiques, nous retiendrons l&#8217;astucieux découpage en 7 phases d&#8217;implémentation :</p><ul><li>Definir un service ou une ressource <strong>simple</strong> : définir le modèle Json et les 4 opérations REST et le servlet qui les fournit.</li><li>Ecrire un client : utiliser le service avec un javascript simple. Cette possibilité est offerte par de nombreux frameworks, dont JQuery.</li><li>Ajouter une étape de validation : modifier le service pour valider les ressources Json et utiliser les codes retour HTTP.</li><li>Complexifier les ressources : modifier la hiérarchie d&#8217;Url pour servir des ressources plus riches. Tester la pérennité des ressources simples (phase 2).</li><li>Ajouter un cache : améliorer les performances et la scalabilité de votre système.</li><li>Implémenter la sécurité : utiliser une authentification web.</li><li>Publier des événements business : pour découpler les processus REST des processus back-end. Les ressources REST sont traitées, un évènement business est lancé, qui déclenche le ou les traitements back-end.</li><li>Gérer un cycle de vie pour les ressources : coupler un état de la ressource avec la phase de validation et la phase de publication des évènements.</li></ul><h3><a
name="EvnementsdenotrecommunautenFra"></a>Evènements de notre communauté en France et à l&#8217;étranger</h3><h4><a
name="SoireDatagridauParisJug"></a>Soirée Datagrid au Paris Jug</h4><p>Le <a
href="http://blog.xebia.fr/2009/05/06/paris-jug-soiree-grid-computing-le-12-mai/" title="DataGrid au Paris Jug" >DataGrid au Paris Jug</a>, c&#8217;est demain.<br
/> <a
href="http://www.jugevents.org/jugevents/event/16041" title="Pensez  rserver" >Pensez à réserver</a> si ce n&#8217;est déjà fait.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/11/revue-de-presse-xebia-108/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>@Inject standardisation de l&#8217;injection de dépendances</title><link>http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/</link> <comments>http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/#comments</comments> <pubDate>Mon, 11 May 2009 16:46:47 +0000</pubDate> <dc:creator>Guillaume Carre</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[@Inject]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[Injection de dépendances]]></category> <category><![CDATA[JSR-299]]></category> <category><![CDATA[JSR-330]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[SpringSource]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1979</guid> <description><![CDATA[Pas mal de bruit la semaine dernière dans la blogosphère Java avec l&#8217;annonce par Google et SpringSource d&#8217;une nouvelle proposition de JSR dédiée à l&#8217;injection de dépendances : @Inject (&#171;&#160;Annotations for Dependency Injection&#160;&#187;). Comme le souligne &#8216;Crazy&#8217; Bob Lee, l&#8217;auteur principal de Google Guice, la sortie de Spring 1.0, il y a déjà 5 ans, [...]]]></description> <content:encoded><![CDATA[<p>Pas mal de bruit la semaine dernière dans la blogosphère Java avec l&#8217;annonce par Google et <a
href="http://www.springsource.com/" title="SpringSource" >SpringSource</a> d&#8217;une nouvelle proposition de JSR dédiée à l&#8217;injection de dépendances : <a
href="http://code.google.com/p/atinject/" title="@Inject ("Annotations for Dependency Injection")" >@Inject (&laquo;&nbsp;Annotations for Dependency Injection&nbsp;&raquo;)</a>.<br
/> Comme le <a
href="http://google-code-updates.blogspot.com/2009/05/javaxinjectinject.html" title="souligne 'Crazy' Bob Lee" >souligne &#8216;Crazy&#8217; Bob Lee</a>, l&#8217;auteur principal de <a
href="http://code.google.com/p/google-guice/" title="Google Guice" >Google Guice</a>, la sortie de Spring 1.0, il y a déjà 5 ans, a apporté l&#8217;injection de dépendances aux masses, via un fichier de configuration propriétaire. Il y a 3 ans, Google Guice a proposé la même chose via des annotations (et SpringSource propose la même chose depuis Spring 2.5).</p><p>Si le succès de Google Guice est assez limité face au raz de marée Spring, le constat est là : il manque un standard. Comme les deux librairies ne sont pas compatibles, si vous exposez à un autre projet/équipe une librairie contenant des dépendances injectées par Google Guice, et que l&#8217;autre équipe utilise Spring, elle devra redéfinir tous les beans et leurs dépendances dans un fichier de configuration Spring (ou des annotations Spring).</p><p>@Inject propose donc de standardiser les annotations, afin de rendre portables sur différents frameworks (<a
href="http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/" title="Guice" >Guice</a>, Spring, <a
href="http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc" title="Tapestry IOC" >Tapestry IOC</a>, etc.) des classes injectables.</p><h3><a
name="Pourquoiautantdebruit"></a>Pourquoi autant de bruit ?</h3><p>Une autre JSR qui parle d&#8217;injection de dépendances a déjà passé le stade de la proposition, la <a
href="http://jcp.org/en/jsr/detail?id=299" title="JSR 299" >JSR 299</a>, ex-Web Beans, portée en particulier par Gavin King de Red Hat, auteur d&#8217;Hibernate. La JSR 299 va beaucoup plus loin (trop?) que l&#8217;injection de dépendances, sujet abordé dans <a
href="http://blog.xebia.fr/2009/01/26/revue-de-presse-xebia-93/#JSRexWebBeansUneJSRDependencyI" title="de précédentes" >de précédentes</a> <a
href="http://blog.xebia.fr/2009/03/16/revue-de-presse-xebia-100/#WebBeanslimplementationdelaJSR" title="revues de presse" >revues de presse</a>.</p><p>La JSR 299 a déjà beaucoup fait parler d&#8217;elle, car elle a récemment été remaniée, afin d&#8217;être intégrée à temps à Java EE 6 (dont la spécification doit être terminée dans 3 mois). Vous pouvez <a
href="http://blog.xebia.fr/2009/01/26/revue-de-presse-xebia-93/#comment-10207" title="lire les commentaires sur notre revue de presse du 26 Janvier dernier" >lire les commentaires sur notre revue de presse du 26 Janvier dernier</a>, dans laquelle nous nous étonnions de l&#8217;absence de SpringSource dans la JSR 299.</p><p>Quelques extraits de ces commentaires :</p><blockquote><p> Emmanuel Bernard (JBoss) : &laquo;&nbsp;<em>&#8230;SpringSource n&#8217;a jamais demandé à faire partie du groupe d&#8217;expertise&#8230;</em>&nbsp;&raquo;<br
/> Emmanuel Bernard : &laquo;&nbsp;<em>&#8230;JBoss a passé un temps énorme à construire JSR 299&#8230;</em>&nbsp;&raquo;<br
/> Antonio Goncalves (Java EE 6 Expert Group) : &laquo;&nbsp;<em>&#8230;la JSR 299 ne se transforme pas radicalement, je dirais plutôt qu&#8217;elle réduit sa voilure et se concentre sur son but initial : un contexte unifié entre les EJBs et JSF&#8230;</em>&nbsp;&raquo;<br
/> Cyrille Le Clerc (Xebia) : &laquo;&nbsp;<em>&#8230;une JSR qui se transforme radicalement, au point de changer de nom, pendant la phase de Public Review, après deux années et demie de travail intensif, cela me parait exceptionnel et peu rassurant&#8230;</em>&nbsp;&raquo;</p></blockquote><h3><a
name="Bonneidemauvaistiming"></a>Bonne idée, mauvais timing ?</h3><p>C&#8217;est dans ce contexte que Google et SpringSource décident de proposer @Inject. L&#8217;intention est légitime, et les deux acteurs sont sans aucun doute les plus expérimentés sur le sujet de l&#8217;injection de dépendances. Il semble en effet beaucoup plus aisé pour Guice, Spring ou autre framework d&#8217;implémenter une JSR de la taille de l&#8217;éventuelle JSR @Inject, alors qu&#8217;on les voit mal implémenter rapidement la JSR 299. Google et SpringSource suggèrent donc à la JSR 299 de ne plus spécifier l&#8217;injection de dépendances, et de réutiliser les annotations définies dans @Inject (extrait de la proposition : &laquo;&nbsp;<em>JSR 299 is defining a dependency injection framework for Java EE, and might support these annotations.</em>&laquo;&nbsp;).</p><p>En revanche le timing nous semble vraiment mal choisi : cette spécification est proposée à quatre mois de la validation de Java EE 6 (Septembre 2009). Cela semblait déjà compliqué pour la JSR 299 (dont l&#8217;inclusion à Java EE 6 n&#8217;a toujours pas été votée), et @Inject ajoute très tard son grain de sel.<br
/> Même si Bob Lee pense pouvoir faire valider @Inject par le JCP en cinq mois, ou moins dans le cadre de Java EE 6, il est peu probable qu&#8217;@Inject fasse partie de Java EE 6 ; on n&#8217;a jamais vu de JSR consensuelle validée aussi rapidement, comment ferait une JSR polémique ? La JSR 299 fait quant à elle face à un planning de plus en plus serré. Le résultat des courses est sans appel : on &laquo;&nbsp;risque&nbsp;&raquo; donc de voir arriver une spécification Java EE 6 sans JSR d&#8217;injection de dépendances.</p><p>Hormis Gavin King (JSR 299 &#8211; JBoss) et Bob Lee (@Inject &#8211; Google) qui ont <a
href="http://in.relation.to/Bloggers/CommentsOnAnnotationsForDependencyInjection" title="âprement débattu sur la blogosphère" >âprement débattu sur la blogosphère</a>, les membres des expert groups de JSR 299 et Java EE 6 sont restés silencieux &#8230; comme Rod Johnson, co-inspirateur de @Inject (qui était sans doute <a
href="http://www.springsource.com/node/1547" title="bien occup la semaine dernire" >bien occupé la semaine dernière</a>).</p><p>Enfin, je vous suggère de prendre quelques minutes pour lire le &laquo;&nbsp;brouillon&nbsp;&raquo; de proposition de JSR @Inject. On y voit de nombreux noms connus et reconnus parmi les supporters de cette JSR (Joshua Bloch, Paul Hammant &#8211; ThoughtWorks &#038; PicoContainer founder, Doug Lea, Tim Peierls, James Strachan, Hani Suleiman, Jason van Zyl &#8211; Maven Plexus, Thiago H de Paula Figueiredo &#8211; Tapestry IoC). @Inject ne propose que de standardiser les annotations, et ne décrit pas la manière dont les dépendances vont être résolues, ce sera à la charge du conteneur. Le périmètre fonctionnel de la proposition est donc très focalisé.</p><h3><a
name="Sousvosyeuxbahisuneinjectionde"></a>Sous vos yeux ébahis, une injection de dépendance sans Spring, sans Guice et sans JSR</h3><p>Pour rappel, même si aucune JSR d&#8217;injection de dépendances n&#8217;est intégrée dans le futur à Java EE 6, vous avez le droit d&#8217;injecter vos dépendances vous même, sans Spring, sans Guice, par exemple avec un simple constructeur Java ! <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><pre class="brush: java; title: ; notranslate">
public class MyService {
	private MyDAO myDAO;
	public MyService(MyDAO myDAO) {
		this.myDAO = myDAO;
	}
}
</pre><p>Ce qui vous permettra d&#8217;y injecter bouchons ou mocks depuis vos <a
href="http://blog.xebia.fr/2008/04/11/les-10-commandements-des-tests-unitaires/" title="tests unitaires" >tests unitaires</a>.</p><h3><a
name="Quelqueslienssurlesujet"></a>Quelques liens sur le sujet</h3><ul><li><a
href="http://crazybob.org/2009/05/announcing-javaxinjectinject.html" title="lannonce sur le blog de Bob Lee" >l&#8217;annonce sur le blog de Bob Lee</a></li><li><a
href="http://in.relation.to/Bloggers/CommentsOnAnnotationsForDependencyInjection" title="la raction de Gavin King" >la réaction de Gavin King et les échanges avec Bob Lee dans les commentaires</a></li><li><a
href="http://code.google.com/p/atinject/" title="le projet Inject sur Google Code" >le projet @Inject sur Google Code</a></li><li><a
href="http://docs.google.com/Doc?id=dd2fhx4z_13cw24s7dj" title="Proposition de la JSR Inject" >Proposition de la JSR @Inject</a></li><li><a
href="http://www.theserverside.com/news/thread.tss?thread_id=54499" title="quelques (rares) commentaires intéressants sur TSS" >quelques (rares) commentaires intéressants sur TSS</a></li><li><a
href="http://twitter.com/#search?q=inject" title="Inject sur twitter" >@Inject sur twitter</a></li></ul><div
align="center"> <a
href="http://twitter.com/gcarre"><br
/> <img
src="http://blog.xebia.fr/wp-content/uploads/2009/04/twitter4.png" alt="twitter guillaume carré" title="twitter guillaume carré"  /><br
/> </a></div> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/05/11/inject-standardisation-de-linjection-de-dependances/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Commencer l&#8217;injection de dépendances avec Tapestry IoC</title><link>http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc/</link> <comments>http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc/#comments</comments> <pubDate>Fri, 24 Apr 2009 13:48:14 +0000</pubDate> <dc:creator>Séven Le Mesle</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[dépendances]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[IoC]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Tapestry]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1829</guid> <description><![CDATA[Quand on parle d&#8217;injection de dépendances, on pense tout de suite à Spring qui se tient sous les feux de la rampe. On peut aussi penser au petit dernier Guice abordé dans l&#8217;article Google Guice 2 : Les bases de l&#8217;injection de dépendances. Mais il ne faudrait pas oublier Tapestry 5 qui, lui aussi, fournit [...]]]></description> <content:encoded><![CDATA[<p>Quand on parle d&#8217;injection de dépendances, on pense tout de suite à <a
href="http://www.springsource.org/" title="Spring" >Spring</a> qui se tient sous les feux de la rampe. On peut aussi penser au petit dernier <a
href="http://code.google.com/p/google-guice/" title="Guice" >Guice</a> abordé dans l&#8217;article <a
href="http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/" title="Google Guice 2 : Les bases de l'injection de dépendances" >Google Guice 2 : Les bases de l&#8217;injection de dépendances</a>. Mais il ne faudrait pas oublier <a
href="http://tapestry.apache.org/tapestry5/" title="Tapestry 5" >Tapestry 5</a> qui, lui aussi, fournit sa solution pour l&#8217;injection de dépendances. <a
href="http://tapestry.apache.org/tapestry5/tapestry-ioc/" title="Tapestry IoC" >Tapestry IoC</a>, à ne pas confondre avec le framework de développement Web Tapestry 5, est très fortement inspiré de Guice. Son but affiché est de tirer le meilleur de Guice tout en apportant l&#8217;héritage de son grand frère défunt <a
href="http://hivemind.apache.org/" title="Hivemind" >Hivemind</a>. On garde donc l&#8217;objectif zéro XML en le remplacant par du code Java. Parmi les avantages de cette technique, on citera :</p><ul><li>Le démarrage d&#8217;une application est plus rapide avec une configuration IOC en annotations Java qu&#8217;avec une configuration XML à parser</li><li>On peut tester unitairement les modules d&#8217;injection puisqu&#8217;il s&#8217;agit de classe Java simple</li><li>Finie la configuration laborieuse en XML</li></ul><p>J&#8217;ai même envie de rajouter que l&#8217;apprentissage d&#8217;une API Java est bien plus rapide que celui d&#8217;une syntaxe XML. Tout comme Guice, Tapestry IoC se concentre sur l&#8217;injection de dépendances et ne tente pas de fournir une stack complète de développement comme le fait Spring. On ne trouve ni les Aspects, ni le pattern Template cher à Spring. Pour répondre aux besoins de programmation par aspect, Tapestry IoC propose <em>des interceptors</em> qui peuvent décorer les services. D&#8217;autre part, dans Tapestry IoC, l&#8217;injection est définie dans un ou plusieurs module(s) chacun d&#8217;eux pouvant contribuer à la configuration et aux services de l&#8217;application.</p><p>Dans ce premier article de la série Tapestry 5 qui commence aujourd&#8217;hui, nous verrons les bases de l&#8217;injection avec Tapestry IoC et les différences par rapport à Spring et Guice.</p><h3><a
name="LinjectionparBuilder"></a>L&#8217;injection par Builder</h3><p>Pour commencer, prenons un service qui utilise un DAO.</p><pre class="brush: java; title: ; notranslate">
public MyServiceImpl implements MyService {
  private final MyDao dao;
  public MyServiceImpl(MyDao dao){
     this.dao = dao;
  }
}
public MyAppModule {
  public static MyService build(MyDao dao){
    return new MyServiceImpl(dao);
  }
}
</pre><p>C&#8217;est la forme la plus simple de l&#8217;injection supportée par Tapestry. Ici on a directement la main sur l&#8217;instanciation du service. Notons que la classe MyAppModule n&#8217;implémente ou n&#8217;hérite d&#8217;aucune classe. Au lieu de cela, il suffit de fournir une méthode nommée &#8216;build&#8217; que Tapestry utilise pour enregistrer le nouveau service. Si on veut fournir plusieurs services, on peut créer des méthodes <em>buildXxx</em> où <em>Xxx</em> prendra le nom à donner au service par exemple &#8216;buildMyDao&#8217;.</p><p>Pour ce qui est du paramètre <em>dao</em>, Tapestry injecte le premier service du même type qu&#8217;il trouve dans le registre. Cette méthode a le mérite d&#8217;être simple, mais ce n&#8217;est pas la méthode recommandée car elle force l&#8217;instanciation de tous les services au démarrage d&#8217;une part. D&#8217;autre part la méthode <strong>build</strong> est <strong>static</strong> ce qui n&#8217;est pas non plus recommandé notamment pour les tests unitaires.</p><p>Pour comprendre, il faut savoir que dans Tapestry, tous les services injectés sont en fait des proxies qui vont, par défaut, instancier le service à la première utilisation. Cela permet de charger l&#8217;application encore plus rapidement, de n&#8217;instancier que ce qui est réellement utilisé, et d&#8217;éliminer tout problème de dépendances cyclique.</p><p><strong>Attention: Les services sont construits dans un scope &#8216;singleton&#8217; par défaut où &#8216;per-thread&#8217;.</strong></p><p>On joue ici sur les terres de Guice qui de son côté propose le <em>bind to instance</em>, équivalent. Bien sûr, on pourra faire un équivalent avec Spring en passant soit par une BeanFactory et du XML, soit par <a
href="http://static.springframework.org/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html" title=" Spring JavaConfig Bean" > Spring JavaConfig @Bean</a>.</p><h3><a
name="LesBinders"></a>Les Binders</h3><p>Ici comme ailleurs, on peut activer le chargement retardé des services en passant par le Binder Tapestry. On va aussi pouvoir distinguer les différents services qui implémentent la même interface.</p><pre class="brush: java; title: ; notranslate">
public MyAppModule {
  public void bind(ServiceBinder binder){
    binder.bind(MyService.class, MyServiceDaoImpl.class).withId(&quot;MyServiceDao&quot;);
    binder.bind(MyService.class, MyServiceXMLImpl.class).withId(&quot;MyServiceXML&quot;);
  }
}
</pre><p>Le ServiceBinder permet d&#8217;associer une classe à son implémentation. En plus de l&#8217;association interface-implémentation, on spécifie un identifiant qui distinguera notre service. Attention : l&#8217;identifiant du service doit être unique pour toute l&#8217;application (utilisez une ou plusieurs classes de constantes pour votre identifiants).</p><p>En revenant à notre classe MyServiceImpl, on peut se demander comment Tapestry va injecter le dao. C&#8217;est le constructeur avec le plus de paramètres qui est appelé. L&#8217;injection peut aussi être gérée par setter ou par des annotations de champs.</p><p>Si on imagine maintenant que plusieurs services implémentent l&#8217;interface MyDao, il faut récupérer la bonne instance avec @Inject.</p><pre class="brush: java; title: ; notranslate">
public MyServiceImpl implements MyService {
  private final MyDao dao;
  @Inject
  private AnotherService otherService;
  public MyServiceImpl (@Inject(&quot;MyDao&quot;) MyDao dao){
     this.dao = dao;
  }
}
</pre><p>Avec l&#8217;annotation, on a choisi de récupérer le dao ayant pour identifiant &laquo;&nbsp;MyDao&nbsp;&raquo; dans le constructeur. On notera que le champ otherService est directement injecté sans passer par le constructeur. La méthode par constructeur est toutefois préférable pour obtenir des champs finaux et permettre l&#8217;injection de Mock dans les unitaires.<br
/> C&#8217;est également obligatoire pour les tests vraiment unitaires (en isolation) qui souhaitent remplacer &laquo;&nbsp;otherService&nbsp;&raquo; par un Mock ou un bouchon.</p><p>Faut-il le dire ? On voit clairement l&#8217;inspiration donnée par Guice, tant sur le ServiceBinder que sur l&#8217;annotation @Inject.</p><p><strong> Attention: Contrairement à Guice et Spring, Tapestry IoC n&#8217;est pas sensible à la casse.</strong></p><p>Tapestry recommande encore une autre méthode pour distinguer les services en utilisant les Markers. Il s&#8217;agit de créer une annotation qu&#8217;on utilisera à la place d&#8217;@Inject pour récupérer la bonne instance.</p><pre class="brush: java; title: ; notranslate">
@Target(
{ PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface MyDaoHibernate
{
}
public MyAppModule {
  public static void bind(ServiceBinder binder){
    binder.bind(MyDao.class, MyDaoHibernateImpl.class).withId(&quot;MyDao&quot;).withMarkerId(MyDaoHibernate.class);
  }
}
public MyServiceImpl implements MyService {
  private final MyDao dao;
  public MyServiceImpl (@MyDaoHibernate MyDao dao){
     this.dao = dao;
  }
}
</pre><p>On a donc d&#8217;abord créé une annotation Runtime pouvant être appliquée sur des paramètres ou des champs. On l&#8217;a ensuite associée à la déclaration du service via le ServiceBinder. Enfin, on a injecté le paramètre du constructeur avec notre annotation marker.</p><p>Cette nouvelle approche peut paraître un peu lourde, mais elle a l&#8217;avantage de faciliter le refactoring et de réduire encore les risques liés à la configuration. Quoi que l&#8217;on fasse, il restera toujours des annotations à mettre dans le code source de nos services. Même si cette fois l&#8217;annotation utilisée vient de nos sources et pas d&#8217;un import tapestry5.ioc.XXX ce qui est moins intrusif il faut bien le reconnaître.<br
/> A mi-chemin entre la String de configuration et le Marker, utiliser une bonne vieille constante semble être un bon compromis.</p><h3><a
name="Lesmodules"></a>Les modules</h3><p>On en a vu un exemple plus haut, un Module est une classe POJO qui doit contenir des méthodes utilisant une convention de nom. Jusqu&#8217;à maintenant tous les exemples ont utilisé des méthodes statiques. Ce n&#8217;est absolument pas une obligation. On peut très bien utiliser des méthodes d&#8217;instance et stocker les services dans des champs pour réaliser un cache de services. Dans ce cas, l&#8217;injection des dépendances du module pourra se faire comme d&#8217;habitude dans le constructeur ou dans les champs.</p><p>Avec un peu d&#8217;aide, Tapestry IoC est capable de charger automatiquement tous les modules du classpath. Il suffit de les lister dans le Manifest du Jar. On ajoute donc une ligne à notre Manifest :</p><pre class="brush: java; title: ; notranslate">
Tapestry-Module-Classes: org.example.mylib.MyAppModule, org.example.mylib.internal.InternalModule
</pre><p>C&#8217;est déjà bien, mais la liste des modules s&#8217;allongeant, cela peut vite devenir désagréable. Pour éviter de trop rallonger le Manifest, et pour se simplifier la vie, on va plutôt fournir une seule classe. Avec l&#8217;annotation @SubModule, on ajoute directement dans notre module ancêtre la liste des &laquo;&nbsp;sous-modules&nbsp;&raquo; à charger.</p><pre class="brush: java; title: ; notranslate">
@SubModule({InternalModule.class})
public MyAppModule {
 /* ... */
}
</pre><p>Le registre, une fois lancé, pourra charger tous les modules du classpath. On voit déjà le gros avantage pour des plugins. Ils pourront par exemple être livrés séparément de notre application principale.</p><h3><a
name="Lesconfigurations"></a>Les configurations</h3><p>Un des points forts de Tapestry IoC est la notion de configuration distribuée. Le principe est de permettre d&#8217;une part, de passer une configuration à la construction d&#8217;un service. D&#8217;autre part, chaque module peut contribuer à la construction de la configuration de tous les services.</p><p>Imaginons par exemple un système d&#8217;export de fichiers associant un type à un FileExporter qui permet de générer l&#8217;export. Notre service fournit un PDFExporter et un CSVExporter. En basant notre FileExporterService sur une configuration, on pourra plus tard ajouter dans un autre module un WordExporter par exemple.</p><pre class="brush: java; title: ; notranslate">
public MyFileExporterModule {
  public static FileExporterService buildFileExporterService(Map&lt;String,FileExporter&gt; contributions)
  {
    return new FileExporterServiceImpl(contributions);
  }
  public static void contributeFileExporterService(MappedConfiguration&lt;String, FileExporter&gt; configuration)
  {
    configuration.add(&quot;csv&quot;, new CSVFileExporter());
    configuration.add(&quot;pdf&quot;, new PDFFileExporter());
  }
}
</pre><p>On a créé un module publiant un service FileExporterService prenant une map de FileExporter en paramètre. On a pris soin d&#8217;ajouter à la map de configuration nos deux exports existants : le CSVFileExporter et le PDFFileExporter.</p><p>On peut maintenant ajouter un module fournissant un nouveau type d&#8217;export.</p><pre class="brush: java; title: ; notranslate">
public static void contributeFileExporterService(MappedConfiguration&lt;String, FileExporter&gt; configuration)
  {
    configuration.add(&quot;doc&quot;, new DocFileExporter());
  }
</pre><p>Cette fois, c&#8217;est un objet de type MappedConfiguration qui doit être pris en paramètre pour être reconnu par Tapestry IoC.</p><p>Il existe trois types de configuration supportés par Tapestry :</p><ul><li>Configuration&lt;T&gt; liste non ordonnée d&#8217;objets, dans le builder on utilisera une Collection&lt;T&gt;</li><li>OrderedConfiguration&lt;T&gt; liste ordonnée, dans le builder on aura une List&lt;T&gt;</li><li>MappedConfiguration&lt;S,T&gt; dans le builder on aura une Map, les clés ne sont pas sensibles à la casse</li></ul><p>Bien forcé de constater que ni Spring, ni Guice ne proposent quelque chose de similaire.</p><h3><a
name="Lancerleregistre"></a>Lancer le registre</h3><p>Il est temps d&#8217;utiliser nos modules dans une application. Il suffit de lancer le registre Tapestry en listant un, ou plusieurs modules à charger. On peut ensuite accéder à nos services.</p><pre class="brush: java; title: ; notranslate">
public MyApplication {
  public static void main(String [] args) {
    RegistryBuilder builder = new RegistryBuilder();
    builder.add(MyAppModule.class);
    Registry registry = builder.build();
    registry.performRegistryStartup();
    MyService service = registry.getService(MyService.class);
    service.doSomething();
      //for operations done from this thread
    registry.cleanupThread();
      //call this to allow services clean shutdown
    registry.shutdown();
  }
}
</pre><p>La construction du registre n&#8217;est pas très compliquée, mais on peut déjà reprocher la lourdeur du système et l&#8217;absence de Helper pour faciliter la construction du registre. Devoir par exemple appeler successivement <strong>builder.build()</strong> puis <strong>registry.performRegistryStartup()</strong><br
/> paraît étrange comparé à la concurrence.<br
/> Ce léger défaut est dû au fait que Tapestry IoC est plus fait pour le framework Tapestry 5 que pour une utilisation extérieure, historiquement en tout cas.</p><h3><a
name="Pourconclure"></a>Pour conclure</h3><p>Voilà un framework d&#8217;injection vraiment léger et facile à prendre en main. Du côté injection de dépendances, on apprécie la méthode par constructeur inspirée de Guice. Reste le problème des annotations dans les sources métiers qui sont trop intrusives à mon goût, même avec des Markers. Pourquoi ne pas permettre d&#8217;injecter les paramètres à fournir au constructeur directement dans le ServiceBinder du module ? Par contre, le chargement automatique des modules et la configuration distribuée, sont de réels plus auxquels on prend goût très rapidement.</p><p>Dans le prochain article, nous tenterons de mettre en avant les particularités de Tapestry IoC et ce que ce framework pourrait changer pour nous autres développeurs.</p><h4><a
name="Pourallerplusloin"></a>Pour aller plus loin</h4><ul><li><a
href="http://tapestry.apache.org/tapestry5/tapestry-ioc/" title="Tapestry IoC" >Tapestry IoC</a></li><li><a
href="http://wiki.apache.org/tapestry/Tapestry5HowTos" title="Tapestry Wiki" >Tapestry Wiki</a></li><li><a
href="http://tapestryjava.blogspot.com/" title="Tapestry Central" >Tapestry Central</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/04/24/commencer-linjection-de-dependances-avec-tapestry-ioc/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Google Guice 2 &#8211; Les bases de l&#8217;injection de dépendances</title><link>http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/</link> <comments>http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/#comments</comments> <pubDate>Wed, 15 Apr 2009 15:53:30 +0000</pubDate> <dc:creator>Pablo Lopez</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[dépendances]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Guice]]></category> <category><![CDATA[IoC]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=1768</guid> <description><![CDATA[Guice (prononcez Juice) est le framework d&#8217;injection de dépendances de Google. La configuration des dépendances se fait par code, à l&#8217;aide d&#8217;annotations, et nécessite donc l&#8217;utilisation de Java 5. Google travaille actuellement sur la V2 de son framework, qui tarde à sortir. Cependant, une mise à jour régulière du Wiki du projet et la publication [...]]]></description> <content:encoded><![CDATA[<p>Guice (prononcez <em>Juice</em>) est le framework d&#8217;injection de dépendances de Google. La configuration des dépendances se fait par code, à l&#8217;aide d&#8217;annotations, et nécessite donc l&#8217;utilisation de Java 5.<br
/> Google travaille actuellement sur la V2 de son framework, qui tarde à sortir. Cependant, une mise à jour régulière du Wiki du projet et la publication de snapshots permettent d&#8217;ores et déjà de se faire une bonne idée de cette alternative à l&#8217;injection de dépendance &#8216;à la Spring&#8217;.</p><p>Nous entamons aujourd&#8217;hui une série d&#8217;articles qui a pour but de vous faire toucher du doigt la grande liberté qu&#8217;offre l&#8217;injection de dépendance par code. Nous irons progressivement des concepts de base de Guice 2.0, vers une utilisation avancée du framework.</p><h3><a
name="Dclarerunedpendanceaveclannota"></a>Déclarer une dépendance avec l&#8217;annotation <em>@Inject</em>.</h3><p>Prenons le postulat de départ suivant : la classe <em>MyServiceImpl</em> (qui implémente l&#8217;interface <em>MyService</em>) doit recevoir l&#8217;injection de la classe <em>MyBasicDaoImpl</em> (qui implémente l&#8217;interface <em>MyBasicDao</em>).<br
/> Dans le code source de la classe à injecter, nous allons donc indiquer que Guice doit s&#8217;occuper de cette injection, en utilisant l&#8217;annotation <em>com.google.inject.Inject</em>. Dans ce premier exemple, nous positionnerons cette annotation au niveau du constructeur.</p><p>En outre, nous déclarons un <em>Appendable</em> qui nous permettra de réaliser des traces. Cet appendable sera injecté directement dans la variable.</p><pre class="brush: java; title: ; notranslate">
public class MyServiceImpl implements MyService {
	@Inject
	private Appendable recorder;
        private final MyBasicDao basicDao;
	@Inject
	public MyServiceImpl(MyBasicDao basicDao) {
		super();
		this.basicDao = basicDao;
	}
}
</pre><p>Vous remarquerez que grâce à l&#8217;injection par constructeur, nous sommes en mesure de déclarer la variable <em> basicDao</em> finale.</p><p>L&#8217;injection peut être réalisée au niveau du constructeur, d&#8217;une méthode voire même de la variable elle-même. Quelques avantages / inconvénients de ces différentes méthodes :</p><ul><li>Constructeur</li><ul><li>+ Les variables peuvent être déclarées finales</li><li>- Ne peut être utilisé si l&#8217;objet est instancié hors de Guice</li></ul><li>Méthode</li><ul><li>+ Permet d&#8217;injecter un objet instancié hors de Guice</li><li>+ Les classes filles n&#8217;ont pas besoin de connaître les dépendances des classes mères.</li></ul><li>Variable</li><ul><li>+ Syntaxe la plus compacte</li><li>- Réduit la testabilité et l&#8217;encapsulation</li></ul></ul><p>La méthode recommandée par Google est l&#8217;injection par constructeur.</p><h3><a
name="Lieruneinterfacesonimplmentati"></a>Lier une interface à son implémentation réelle, dans un <em>Module</em></h3><p>Il nous faut maintenant lier l&#8217;interface <em>MyBasicDao</em> à l&#8217;implémentation que nous souhaitons utiliser dans un premier temps, à savoir <em>MyBasicDaoImpl</em>.<br
/> Ceci se fait dans un module de configuration étendant <em>com.google.inject.Module</em> à l&#8217;aide d&#8217;un DSL relativement explicite.</p><pre class="brush: java; title: ; notranslate">
public class MyModule implements com.google.inject.Module {
	@Override
	public void configure(com.google.inject.Binder binder) {
		// Bind to class
		binder.bind(MyBasicDao.class).to(MyBasicDaoImpl.class);
		binder.bind(MyService.class).to(MyServiceImpl.class);
		// Bind to instance
		binder.bind(Appendable.class).toInstance(System.out);
	}
}
</pre><p>Le <em>Module</em> permet de lier des interfaces à des classes que Guice se chargera d&#8217;instancier (_bind &#8230; to_) mais aussi à des classes déjà instanciées (_bind &#8230; toInstance_) comme c&#8217;est le cas pour notre <em>Appendable</em>, qui sera lié à la console <em>System.out</em>.</p><h3><a
name="RcupreruneinstanceauprsdelInje"></a>Récupérer une instance auprès de l&#8217;<em>Injector</em></h3><p>Dernière étape, il nous faut obtenir une instance injectée de notre service.<br
/> C&#8217;est auprès de la classe <em>com.google.inject.Injector</em> que nous la récupérerons. Cet injecteur est créé de manière statique, à partir d&#8217;un ou plusieurs <em>Module</em>.<br
/> Dans cet exemple, nous réaliserons cette opération à partir d&#8217;un <em>main</em>.</p><pre class="brush: java; title: ; notranslate">
public class MyMain {
	public static void main(String[] args) throws IOException {
		Injector injector = Guice.createInjector(new MyModule());
		MyService myService = injector.getInstance(MyService.class);
		myService.displaySample();
	}
}
</pre><h3><a
name="EtSpringdanstoutca"></a>Et Spring dans tout ca ?</h3><p>La question qui se pose dès que l&#8217;on aborde l&#8217;injection de dépendances est bien sûr &#8216;Oui, mais par rapport à Spring ?&#8217;.<br
/> Essayons d&#8217;éviter la réponse de normand, même si Spring et Guice ne jouent pas dans la même cour : Guice se concentre exclusivement sur l&#8217;injection de dépendances, alors que Spring vise à offrir une stack complète.<br
/> L&#8217;équipe de Guice répond d&#8217;ailleurs elle-même à <a
href="http://code.google.com/p/google-guice/wiki/SpringComparison" title="la question sur son wiki" >la question sur son wiki</a>.<br
/> Cependant, pour donner un point de vue plus pragmatique :</p><ul><li>le footprint du Jar du Guice est bien inférieur à celui (ceux) de Spring Core.</li><li>le chaînage des Beans est plus rapide avec Guice, même si cet argument pèse peu, la majorité des dépendances étant chargées à l&#8217;initialisation de l&#8217;application.</li><li>Guice est plus intrusif (apparition d&#8217;annotations dans le code source des services métier)</li><li>la programmation orientée aspect de Guice est au stade embryonnaire.</li></ul><p>Dans la suite de cette série d&#8217;articles, nous essayerons de montrer que la différence d&#8217;approche entre Guice et Spring offre plus de libertés aux développeurs (mais conduit peut-être aussi à plus de chaos).</p><h3><a
name="Lasuite"></a>La suite ?</h3><p>C&#8217;est déjà la fin de ce premier tutoriel, et vous savez maintenant injecter simplement une classe. Cependant, dans le projet tel qu&#8217;écrit aujourd&#8217;hui, la classe <em>MyBasicDaoImpl</em> sera injectée dans toutes les classes nécessitant un <em>MyBasicDao</em>. Dans un prochain article, nous verrons comment lever cette limite.</p><p><a
href=" http://code.google.com/p/xebia-france/source/browse/google-guice/hands-on/tags/1.1/" title="Tlchargez le projet Eclipse sur le Google Code de Xebia " >Téléchargez le projet Eclipse sur le Google Code de Xebia </a></p><h3><a
name="Ressources"></a>Ressources</h3><p><a
href=" http://code.google.com/p/google-guice/" title="Site officiel " >Site officiel </a><br
/> <a
href="http://www.javalobby.org/articles/guice-vs-spring/?source=archives" title="Un comparatif de performances Spring  Guice bas sur les versions prcdentes" >Un comparatif de performances Spring / Guice, basé sur les versions précédentes</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2009/04/15/google-guice-les-bases-de-linjection-de-dependances/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/</link> <comments>http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#comments</comments> <pubDate>Mon, 20 Oct 2008 18:22:43 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[dmServer]]></category> <category><![CDATA[Flash]]></category> <category><![CDATA[Flex]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jdk-5]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[Netbeans]]></category> <category><![CDATA[RCP]]></category> <category><![CDATA[Silverlight]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=863</guid> <description><![CDATA[La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Dans le cambouis de SpringSource dmServer Agilité Les facteurs clés dans l&#8217;adoption d&#8217;une démarche Agile au niveau de l&#8217;entreprise. RIA Sortie de Microsoft Silverlight 2.0 Un flash Player 10 précipité pour la sortie de Silverlight 2 ? Testez unitairement et [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l’actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#DanslecambouisdeSpringSourcedm">Dans le cambouis de SpringSource dmServer</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#Lesfacteursclsdansladoptiondun">Les facteurs clés dans l&#8217;adoption d&#8217;une démarche Agile au niveau de l&#8217;entreprise.</a></li></ul><p><strong>RIA</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#SortiedeMicrosoftSilverlight">Sortie de Microsoft Silverlight 2.0</a></li><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#UnflashPlayerprcipitpourlasort">Un flash Player 10 précipité pour la sortie de Silverlight 2 ?</a></li><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#Testezunitairementetfonctionne">Testez unitairement et fonctionnellement vos applications Flex avec FlexMonkey</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#NetBeansvsEclipseRCPComparaiso">NetBeans vs Eclipse RCP : Comparaison des mécanismes d&#8217;extensibilité des plug-ins</a></li><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#JavaUpdateQuoideneufdocteur">Java 6 Update 10 : Quoi de neuf docteur ?</a></li><li><a
href="http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/#Noysdanslesannotations">Noyés dans les annotations ?</a></li></ul><h3><a
name="ActualitditeursSSII"></a>Actualité éditeurs / SSII</h3><h4><a
name="DanslecambouisdeSpringSourcedm"></a>Dans le cambouis de SpringSource dmServer</h4><p>Après <a
href="http://blog.xebia.fr/2008/10/06/revue-de-presse-xebia-77/#SortieofficielledeSpringSource" title="l'annonce de la sortie officielle la semaine dernière" >l&#8217;annonce de la sortie officielle la semaine dernière</a>, SpringSource vous propose de découvrir les entrailles de la bête, par le biais d&#8217;une télé-conférence, le 29 octobre à 15:00 CET. Au programme :</p><ul><li>installation et configuration du serveur</li><li>construction d&#8217;une application modulaire</li><li>création d&#8217;un package déployable (PAR)</li><li>développements itératifs et tests</li></ul><p>Les liens d&#8217;inscription se trouvent sur <a
href="http://www.springframework.org/node/795" title="l'annonce originale de SpringSource" >l&#8217;annonce originale de SpringSource</a>.</p><h3><a
name="Agilit"></a>Agilité</h3><h4><a
name="Lesfacteursclsdansladoptiondun"></a>Les facteurs clés dans l&#8217;adoption d&#8217;une démarche Agile au niveau de l&#8217;entreprise.</h4><p>Dans le cadre de la <a
href="http://www.agile2008.org/" title="conférence Agile 2008" >conférence Agile 2008</a>, Michael Mah se prête au petit jeu de la comparaison de productivité entre une entreprise Agile et une entreprise classique (devinez qui a la meilleure productivité).<br
/> Mais ce que nous retiendrons surtout de cette présentation, ce sont les cinq facteurs clés qui ont permis de convertir toute une entreprise (<a
href="http://www.bmc.com/" title="BMC" >BMC</a>) aux méthodes agiles :</p><ul><li>Avoir des éléments moteurs : avoir le soutien des cadres dirigeants, former des Scrums Masters, s&#8217;appuyer sur un noyau de convaincus / passionnés.</li><li>Être toujours prêt à publier : faire des sprints courts de 2 semaines, des builds quotidiens, et porter l&#8217;effort sur des revues de codes régulières et exigeantes.</li><li>Travailler en équipe 24h/24h : communiquer efficacement, s&#8217;armer d&#8217;outils efficaces (wiki, vidéo-conférences, réunions de visu régulières), organiser des Scrum de Scrum.</li><li>Gérer son backlog : tenir un seul backlog partagé, mais plusieurs gestions &#8216;locales&#8217; de celui-ci, nommer une seule équipe chargée de rédiger les user stories, se doter d&#8217;une équipe &laquo;&nbsp;d&#8217;architectes&nbsp;&raquo; pour interfacer la R&#038;D et le backlog.</li><li>Arrêter le développement WaterFall : passer à des développements pilotés par les tests (TDD), organiser des debriefings réguliers pour ne pas retomber dans les travers classiques, faire auditer les processus par un oeil externe.</li></ul><p>Même si certains des points sus mentionnés portent à controverse (on pense en particulier aux TDD qui font débat), ces facteurs clés sont souvent mis en avant, en particulier par les fondateurs de la méthode Scrum, Ken Schwaber et Jeff Sutherland.</p><p>Retrouvez <a
href="http://www.infoq.com/presentations/5-Success-Factors-Michael-Mah" title="l'intégralité du vidcast et du support de présentation" >l&#8217;intégralité du vidcast et du support de présentation</a> sur InfoQ.</p><h3><a
name="RIA"></a>RIA</h3><h4><a
name="SortiedeMicrosoftSilverlight"></a>Sortie de Microsoft Silverlight 2.0</h4><p>Microsoft a annoncé cette semaine la sortie de <a
href="http://www.microsoft.com/silverlight/" title="Silverlight 2" >Silverlight 2</a>.</p><p>Lors de notre récent contest RIA dans lequel nous avions essayé de dégager les avantages et inconvénients de différents framework RIA, nous annoncions un certain nombre de <a
href="http://blog.xebia.fr/2008/10/03/ria-contest-flex-silverlight-gwt-echo3-javafx/#Silverlight" title="points négatifs" >points négatifs</a> sur la version Silverlight que nous avions utilisée (Silverlight 2 Beta 2). Microsoft comble avec cette release officielle un certain nombre d&#8217;entre eux :</p><ul><li>Microsoft se rapproche du monde Java en proposant un ensemble d&#8217;outils permettant le développement Silverlight directement au sein d&#8217;Eclipse. <a
href="http://www.eclipse4sl.org/" title="Eclipse4SL" >Eclipse4SL</a>, de son petit nom, est actuellement disponible en version alpha, la version finale étant <a
href="http://www.eclipse4sl.org/#roadmap" title="prévue" >prévue</a> pour le printemps 2009. Eclipse4SL contiendra également un éditeur graphique permettant la manipulation et la visualisation du XAML.</li><li>Microsoft prévoit également d&#8217;enrichir son catalogue de contrôles via le Silverlight Control Pack (SCP). Seront disponibles des contrôles du type Accordion, DockPanel, ViewTree ou AutoComplete sous la Microsoft Permissive License (open source).</li></ul><div
align="center"> <a
href="http://blog.xebia.fr/wp-content/uploads/2008/10/xaml_full.png"><img
src="http://blog.xebia.fr/wp-content/uploads/2008/10/xaml_full-300x264.png" alt="" title="xaml_full" width="300" height="264" class="alignright size-medium wp-image-865" border="0" /></a></div><h4><a
name="UnflashPlayerprcipitpourlasort"></a>Un flash Player 10 précipité pour la sortie de Silverlight 2 ?</h4><p>Adobe a annoncé la semaine dernière <a
href=" http://labs.adobe.com/technologies/flashplayer10/" title="la sortie de Flash Player 10 en release" >la sortie de Flash Player 10 en release</a> sous le nom d&#8217;Astro.</p><p>Cette nouvelle version comporte des améliorations graphiques et audio :</p><ul><li>Des nouveaux effets 3D plus fluides et plus performants.</li><li>Des effets et filtres customisables par le biais de <a
href="http://labs.adobe.com/wiki/index.php/Pixel_Bender_Toolkit" title="l'outil Pixel Bender" >l&#8217;outil Pixel Bender</a>.</li><li>Gestion de traitement de texte avancé avec plus d&#8217;éléments typographiques.</li></ul><p>Adobe a également pris en compte des demandes d&#8217;amélioration de la communauté Flash avec entre autres :</p><ul><li>plus de contrôles sur le menu contextuel: il est maintenant possible d&#8217;ajouter des items en texte riche.</li><li>la manipulation de grandes images bitmap (jusqu&#8217;à 4096 par 4096)</li><li>sortie de la version Linux en simultanée avec la version Windows, les problèmes spécifiques Ubuntu ont été réglés depuis la bêta</li><li>les touches clavier du type Ctrl, Espace&#8230; peuvent maintenant être accessibles en plein écran: ce qui peut être pratique pour le développement des jeux Flash.</li></ul><p>Vous pouvez retrouver <a
href="http://labs.adobe.com/technologies/flashplayer10/releasenotes.html#features" title="la liste complète des fonctionnalités" >la liste complète des fonctionnalités</a> sur le site d&#8217;Adobe.</p><p>Comme le signale <a
href="http://www.jroller.com/melix/entry/adobe_releases_a_buggy_flash" title="l'article publié sur le blog de Cedric Champeau" >l&#8217;article publié sur le blog de Cedric Champeau</a>, à la sortie du plugin un certain nombre de bugs persistent, la sortie simultanée de Silverlight 2 aurait-elle fait accélérer les choses ?</p><h4><a
name="Testezunitairementetfonctionne"></a>Testez unitairement et fonctionnellement vos applications Flex avec FlexMonkey</h4><p>Une à une, les barrières au développement de Flex tombent. Dernière avancée, la mise en ligne d&#8217;un framework de tests automatisés, <a
href="http://code.google.com/p/flexmonkey/" title="FlexMonkey" >FlexMonkey</a>. <a
href="http://www.infoq.com/news/2008/10/flexmonkey-testing" title="Pour InfoQ, Stu Stern (Gorilla Logic)" >Pour InfoQ, Stu Stern (Gorilla Logic)</a>, fondateur du projet, revient sur les grandes lignes de ce projet OpenSource :</p><ul><li>Ne nécessite pas de plugin autre que le plugin Flash</li><li>Possibilité d&#8217;enregistrer et de rejouer des tests (à la manière d&#8217;un <a
href="http://selenium.openqa.org/" title="Selenium" >Selenium</a>), aussi bien que d&#8217;éditer le code source des tests, écrit en AS3</li><li>Outil sous licence Apache2. Cependant, le framework utilise l&#8217;API Flex Automation, qui n&#8217;est disponible que sous Flex Builder Pro (qu&#8217;il vous faudra donc acquérir si vous souhaitez modifier FlexMonkey).</li><li>Possibilité de simuler des évènements asynchrones avec un temps d&#8217;attente plus ou moins long.</li></ul><p>L&#8217;<a
href="http://keystone.gorillalogic.com/~sstern/MonkeyContacts.html" title="application de démonstration" >application de démonstration</a> est relativement bluffante pour un produit aussi jeune.<br
/> Alors, pourquoi ne pas laisser le singe tester votre RIA ?</p><h3><a
name="Lecoindelatechnique"></a>Le coin de la technique</h3><h4><a
name="NetBeansvsEclipseRCPComparaiso"></a>NetBeans vs Eclipse RCP : Comparaison des mécanismes d&#8217;extensibilité des plug-ins</h4><p>Pour faire suite <a
href="http://blog.xebia.fr/2008/10/16/osgi-au-paris-jug-slides-de-la-presentation/">au Paris JUG</a> de la semaine dernière, voici un bel exemple de débat entre choisir une solution standard de JavaSE ou l&#8217;utilisation de la plateforme OSGi. En effet, dans le monde des plateformes Rich-Client, Netbeans a choisi un mécanisme d&#8217;extensibilité qui s&#8217;appuie sur le ServiceLoader du JDK 6 au contraire d&#8217;Eclipse qui a préféré tout basculer sous OSGi et ses bundles.</p><p>Les avantages et les inconvénients des deux mécanismes sont présentés dans <a
href="http://java.dzone.com/articles/netbeans-vs-eclipse-rcp-plugin" title="cet article" >cet article</a> où l&#8217;auteur semble avoir un léger penchant pour Eclipse.<br
/> Heureusement, les commentaires instructifs qui suivent, dont ceux du responsable technique de la documentation de NetBeans, <a
href="http://blogs.sun.com/geertjan/" title="Geertjan Wielenga" >Geertjan Wielenga</a>, viennent alimenter le débat.</p><p>En quelques mots, Netbeans est simple d&#8217;apprentissage mais avec une mise en œuvre peu explicite et confuse. En face, Eclipse offre la rigueur de définition des bundles OSGi (très précise) mais avec une plus longue prise en main.</p><h4><a
name="JavaUpdateQuoideneufdocteur"></a>Java 6 Update 10 : Quoi de neuf docteur ?</h4><p>Beaucoup de nouvelles fonctionnalités orientées utilisateur finale pour facilité le déploiement et l&#8217;exécution d&#8217;applet, parmi lesquelles :</p><ul><li>L&#8217;intégration de <a
href="http://java.sun.com/javase/6/docs/technotes/guides/jweb/otherFeatures/jqs.html" title="Java Quick Starter (JQS)" >Java Quick Starter (JQS)</a></li><ul><li>Un service Windows (XP/2000) permet de précharger dans le cache disque de l&#8217;OS des fichiers les plus utilisés par la JRE, afin de permettre un démarrage à froid plus rapide.</li></ul><li><a
href="https://jdk6.dev.java.net/plugin2/" title="Next Generation Java Plug-in" >Next Generation Java Plug-in</a></li><ul><li>Ce plug-in, pour Internet explorer et Firefox 3, permet notamment de démarrer une applet depuis un fichier JNLP de la même manière qu&#8217;une application Java Web Start et d&#8217;améliorer la communication entre javascript et java (détection de version, téléchargement de la JRE&#8230;).</li></ul><li><a
href="http://java.sun.com/developer/technicalArticles/javase/java6u10/#kernel" title="Java Kernel" >Java Kernel</a></li><ul><li>Distribution allégée de la JRE, puis téléchargement à la demande des dépendances selon les applications chargées, pour permettre une réduction du temps de téléchargement et d&#8217;exécution initiale de la JVM.</li></ul><li>Possibilité de mettre à jour une même version majeure de la JRE, pour éviter la multiplication des installations et réduire les téléchargements.</li><li>Réécriture de l&#8217;accélération Direct3D pour la plateforme Microsoft Windows, qui est désormais activée par défaut.</li><li><a
href="http://developers.sun.com/javadb/" title="Java DB 10.4" >Java DB 10.4</a> est dorénavant inclus dans la JRE.</li><li>Nouveau Look &#038; Feel <a
href="http://java.sun.com/developer/technicalArticles/javase/java6u10/#nimbus" title="Nimbus" >Nimbus</a> utilisant des graphiques 2D vectoriels à la place de bitmaps pour les composants permettant de mieux gérer le redimensionnement.</li></ul><p>La <a
href="http://java.sun.com/javase/6/webnotes/6u10.html" title="liste complète" >liste complète</a> des fonctionnalités sur le site de Sun.</p><h4><a
name="Noysdanslesannotations"></a>Noyés dans les annotations ?</h4><p>L&#8217;introduction des annotations a permis l&#8217;arrivée de la programmation déclarative en Java en ajoutant des <em>metadatas</em> à nos objets. Si la programmation déclarative est une bonne chose, l&#8217;utilisation des annotations <em>à tout va</em> engendre de plus en plus de bruits dans nos objets. Comme ce mécanisme se propage à la majorité des frameworks, vos beans se retrouvent noyés au milieu de dizaines d&#8217;annotations Spring / Hibernate / JPA / JUnit / EJB / JBoss Cache / Validation / GridGain / j&#8217;en passe et des meilleures &#8230;</p><p>Nous sommes loin de penser que leur utilisation est une mauvaise chose. Pourtant, il faut reconnaitre que les annotations sont souvent <strong>sur-utilisées</strong>. Il nous faudra par ailleurs faire d&#8217;autant plus attention dans le futur avec l&#8217;arrivée du Jdk 7 qui devrait permettre l&#8217;ajout d&#8217;annotations <a
href="http://blog.xebia.fr/2008/02/20/nagez-avec-les-dauphins-jdk-7-proposals-overview/" title="un peu partout dans le code" >un peu partout dans le code</a> :</p><ul><li>Map&lt;@NotNull String, @NotNull List<@Readonly Document&gt;> files;</li><li>class Folder&lt;F extends @Existing File&gt; { }</li><li>void monitorTemperature() throws @Critical TemperatureExceptuion { }</li><li>String s = (@NotNull String) object;</li><li>boolean isNotNull = myObject instanceOf @NotNull String;</li><li>new @NonEmpty @ReadOnly ArrayList&lt;String&gt;()</li></ul><p>Il est donc important de savoir utiliser les annotations à bon escient. C&#8217;est ce que nous propose <a
href="http://willcode4beer.com/opinion.jsp?set=annotations_gotchas_best_practices" title="l'auteur de cet article" >l&#8217;auteur de cet article</a> dont nous mettons en avant ici les principaux points.</p><p>L&#8217;utilisation des annotations est conseillée lorsqu&#8217;elles :</p><ul><li>Facilitent la configuration</li><li>Évitent les interfaces inutiles et remplacent les interfaces &#8216;marqueur&#8217;</li><li>Permettent la déclaration de métadatas interprétées au runtime</li></ul><p>À l&#8217;inverse, il est déconseillé d&#8217;utiliser celles-ci lorsqu&#8217;elles :</p><ul><li>décrivent des informations spécifiques à un environnement (base de données / JNDI &#8230;)</li><li>sont utilisées comme des macros</li></ul><p>Au final, il sera difficile de trouver un consensus sur ce sujet polémique qui n&#8217;est pas sans nous rappeler d&#8217;autres <a
href="http://blog.xebia.fr/2008/07/23/enumerations-utilisation-avancee/" title="critiques similaires" >critiques similaires</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/20/revue-de-presse-xebia-79/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Ce que vous avez peut-être raté au troisième trimestre 2008</title><link>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/</link> <comments>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/#comments</comments> <pubDate>Wed, 01 Oct 2008 06:51:57 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Divers]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[développement]]></category> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[log]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Supervision]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=773</guid> <description><![CDATA[Voici la liste des billets les plus lus sur ce blog en juillet, août et septembre : Les 10 commandements des logs applicatives Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité : durant le développement, afin de suivre l&#8217;exécution pas à pas et de [...]]]></description> <content:encoded><![CDATA[<p>Voici la liste des billets les plus lus sur ce blog en juillet, août et septembre :</p><h4><a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/">Les 10 commandements des logs applicatives</a></h4><p>Tout au long du cycle de vie d&#8217;une application J2EE, il est nécessaire de posséder des traces de qualité :</p><ul><li>durant le développement, afin de suivre l&#8217;exécution pas à pas et de détecter d&#8217;éventuelles anomalies.</li><li>durant la recette, afin de corréler anomalies fonctionnelles et exécution du programme.</li><li>durant l&#8217;exploitation, afin de surveiller la &laquo;&nbsp;bonne santé&nbsp;&raquo; de l&#8217;application.</li></ul><p>Mais obtenir des traces de qualité n&#8217;est pas un exercice trivial. C&#8217;est pourquoi nous vous proposons nos 10 commandements des logs.</p><p><a
href="http://blog.xebia.fr/2008/07/11/les-10-commandements-des-logs-applicatives/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/">Simplifiez votre configuration Spring 2.5 avec les annotations</a></h4><p>Spring 2.5 <a
href="http://www.springframework.org/node/561" title="est sorti" >est sorti</a> depuis le 19 novembre 2007 comme nous l&#8217;annoncions, il y a quelques temps, dans notre <a
href="http://blog.xebia.fr/2007/11/26/revue-de-presse-xebia-33/#Spring" title="revue de presse" >revue de presse</a>. Vous avez comme moi sagement mis à jour vos poms Maven2 vers la dernière release de Spring (normalement et la plupart du temps compatible avec les versions 2.0.x).</p><p>Mais avez-vous vraiment profité des nouveautés de cette version en terme de configuration ?</p><p><a
href="http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/">Lire cet article »</a></p><h4><a
href="http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/">Programmation concurrente : notions fondamentales</a></h4><p>Jouer avec les Threads n&#8217;est pas trivial. En informatique de gestion, cette difficulté est heureusement masquée par les serveurs d&#8217;application et les API spécifiques. La plupart du temps, ils permettent aux développeurs de s&#8217;abstraire de ces contraintes et de se concentrer sur le code métier, moins technique. Il arrive pourtant qu&#8217;il faille se relever les manches. Certains besoins vous ont certainement déjà poussé à faire communiquer 2 Threads.<br
/> Si le développement n&#8217;est pas facile, le debug peut devenir une calamité ! La programmation concurrente ne soulève pourtant que 3 types majeurs de problèmes. Faites le sondage autour de vous, les développeurs associent trop rapidement le mot clé <code>synchronize</code> au multithreading sans en comprendre véritablement le fonctionnement. Demandez-leur ensuite de vous décrire l&#8217;utilité du mot clé <code>volatile</code> &#8230;</p><p>Cet article revient sur les grands principes de la programmation concurrente.</p><p><a
href="http://blog.xebia.fr/2008/08/13/programmation-concurrentielle-notions-fondamentales/">Lire cet article »</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/10/01/ce-que-vous-avez-peut-etre-rate-au-troisieme-trimestre-2008/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Simplifiez votre configuration Spring 2.5 avec les annotations</title><link>http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/</link> <comments>http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/#comments</comments> <pubDate>Fri, 08 Aug 2008 13:20:44 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[Spring]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=564</guid> <description><![CDATA[Spring 2.5 est sorti depuis le 19 novembre 2007 comme nous l&#8217;annoncions, il y a quelques temps, dans notre revue de presse. Vous avez comme moi sagement mis à jour vos poms Maven2 vers la dernière release de Spring (normalement et la plupart du temps compatible avec les versions 2.0.x). Mais avez-vous vraiment profité des [...]]]></description> <content:encoded><![CDATA[<p>Spring 2.5 <a
href="http://www.springframework.org/node/561" title="est sorti" >est sorti</a> depuis le 19 novembre 2007 comme nous l&#8217;annoncions, il y a quelques temps, dans notre <a
href="http://blog.xebia.fr/2007/11/26/revue-de-presse-xebia-33/#Spring" title="revue de presse" >revue de presse</a>. Vous avez comme moi sagement mis à jour vos poms Maven2 vers la dernière release de Spring (normalement et la plupart du temps compatible avec les versions 2.0.x). Mais avez-vous vraiment profité des nouveautés de cette version en terme de configuration ?</p><h3><a
name="LesnouveautsSpring"></a>Les nouveautés Spring 2.5</h3><p>Spring introduit plusieurs nouveautés concernant sa configuration, toutes les évolutions visant à la simplifier (ou à améliorer l&#8217;existant) :</p><ul><li>Ajout de nouvelles balises basées sur les possibilités d&#8217;<a
href="http://static.springframework.org/spring/docs/2.5.x/reference/extensible-xml.html" title="extension de schéma de Spring" >extension de schéma de Spring</a> <em>(Exemple : L&#8217;ajout des namespaces jms, context ou l&#8217;amélioration des namespaces jee, aop)</em></li><li>La création de JavaConfig</li><li>Le support des annotations Java 5, déjà amorcé dans Spring 2.0</li></ul><p>Dans cet article, nous nous concentrerons sur les possibilités de configuration avec les annotations mais sans éviter un ou deux écarts <img
src='http://blog.xebia.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p><h3><a
name="ConfigurationXML"></a>Configuration XML</h3><p>Je vous parle d&#8217;annotations depuis le début de cet article, et le premier bout de code que je vous propose est en &#8230; XML. Eh oui, la prise en compte par Spring des annotations se configure encore en XML.</p><p>Mais heureusement avec <a
href="http://static.springframework.org/spring/docs/2.5.x/reference/xsd-config.html#xsd-config-body-schemas-context" title="l'extension de schéma 'context'" >l&#8217;extension de schéma &#8216;context&#8217;</a>, cette configuration est très simple. Il suffit d&#8217;ajouter deux balises : la première sert à ajouter un certain nombre de BeanPostProcessor (voir <a
href="http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config" title="la documentation" >la documentation</a>), la seconde à définir le ou les packages (séparés par des virgules) que Spring va devoir parcourir à la recherche de nos annotations.</p><pre class="brush: xml; title: ; notranslate">
&lt;beans
	...
	xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
	xsi:schemaLocation=&quot;
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd&quot;&gt;
	&lt;context:annotation-config /&gt;
	&lt;context:component-scan base-package=&quot;fr.xebia.demo.wicket.blog.service&quot; /&gt;
&lt;/beans&gt;
</pre><p>La balise <code>&lt;context:component-scan&gt;</code> n&#8217;est requise que si nous utilisons les annotations &#8216;stéréotype&#8217; de Spring. Il est possible d&#8217;être plus directif sur la recherche d&#8217;annotations dans les classes comme le montre l&#8217;exemple ci-dessous.</p><pre class="brush: xml; title: ; notranslate">
&lt;context:component-scan base-package=&quot;example&quot; use-default-filters=&quot;false&quot;&gt;
   &lt;context:include-filter type=&quot;aspectj&quot; expression=&quot;example..Stub*&quot;/&gt;
   &lt;context:include-filter type=&quot;annotation&quot; expression=&quot;example.Mock&quot;/&gt;
   &lt;context:exclude-filter type=&quot;annotation&quot; expression=&quot;org.springframework.stereotype.Repository&quot;/&gt;
&lt;/context:component-scan&gt;
</pre><h3><a
name="LesstrotypesSpring"></a>Les stéréotypes Spring</h3><p>Habituellement pour déclarer un bean géré par Spring, on devait ajouter une balise <code>&lt;bean name=...&gt;</code> dans notre fichier xml de configuration Spring. La balise <code>&lt;context:component-scan&gt;</code> vue précédemment indique à Spring qu&#8217;il doit rechercher  dans le code certaines annotations que voici : <code>@Repository</code>, <code>@Service</code>, <code>@Controller</code>, <code>@Component</code>.</p><p>Ces annotations n&#8217;ont pas d&#8217;effet particulier sur l&#8217;injection de dépendances : elles servent entre autres à &#8216;catégoriser&#8217; plus finement nos beans pour, en cas de besoin, appliquer des aspects plus facilement par la suite. Il faut voir ces annotations comme une bonne pratique à mettre en place pour donner du sens à nos beans.</p><ul><li><code>@Repository</code> : Cette annotation existe depuis Spring 2.0 et sert à identifier un bean de type DAO.</li><li><code>@Service</code> : Celle-ci identifie le bean comme un service</li><li><code>@Controller</code> : Utile uniquement si l&#8217;on utilise SpringMVC, cette annotation indique un contrôleur Spring MVC.</li><li><code>@Component</code> : Cette dernière est l&#8217;annotation générique pouvant fonctionner pour n&#8217;importe quel bean</li></ul><p>Autre avantage, Spring se sert de ces annotations pour appliquer lui aussi quelques aspects, comme par exemple, <code>@Repository</code> qui est pris en compte par Spring comme un marqueur pour la translation automatique d&#8217;exception pour la couche de persistance.</p><p>Voici un exemple très simple :</p><pre class="brush: java; title: ; notranslate">
@Repository
public class ClientDAO {
    [...]
}
</pre><p>Chaque annotation prend un attribut &#8216;name&#8217; optionnel qui peut être utilisé pour nommer explicitement le bean.</p><p>Ces annotations permettent de référencer nos beans dans le contexte d&#8217;application Spring pour qu&#8217;il puisse réaliser les injections de dépendances. Sans annotation, un bean n&#8217;est pas traité par Spring. Il existe une dernière annotation permettant de demander à Spring d&#8217;injecter des dépendances sur un bean qu&#8217;il ne gère pas : c&#8217;est l&#8217;annotation <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Configurable.html" title="@Configurable" >@Configurable</a>. Spring ne va pas gérer le bean mais va quand même réaliser l&#8217;injection des dépendances sur celui-ci.</p><p>Pour modifier le cycle de vie de nos beans, il est aussi toujours possible de préciser le scope avec l&#8217;annotation du même nom : <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/context/annotation/Scope.html" title="@Scope" >@Scope</a>.</p><h3><a
name="Linjectiondesdpendances"></a>L&#8217;injection des dépendances</h3><p>Nous venons de voir comment référencer nos beans dans le contexte d&#8217;application Spring. Nous allons étudier maintenant la façon de configurer l&#8217;injection de nos dépendances. Cela passe, bien sûr, par l&#8217;ajout de quelques annotations dans notre code. Il y a deux catégories d&#8217;annotations : les standards et les propriétaires Spring.</p><h4><a
name="LesupportdelaJSRetdeJPA"></a>Le support de la JSR-250 et de JPA</h4><p>La <a
href="http://jcp.org/en/jsr/detail?id=250" title="JSR-250" >JSR-250</a> introduit plusieurs annotations permettant de déclarer un besoin d&#8217;injection de dépendances. Spring supporte l&#8217;annotation <a
href="http://java.sun.com/javase/6/docs/api/javax/annotation/Resource.html" title="@Resource" >@Resource</a> permettant la déclaration d&#8217;une ressource à injecter (cette annotation peut prendre l&#8217;attribut &#8216;name&#8217; en paramètre). Dans la terminologie Spring, ce type d&#8217;injection est appelée &#8216;by-name&#8217;. Pour déclarer une dépendance comme obligatoire, on ajoutera l&#8217;annotation @Required. Dans cette JSR, il existe deux autres annotations prises en charge par Spring : <code>@PreConstruct</code> et <code>@PostDestroy</code> qui remplace l&#8217;utilisation des interfaces <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/InitializingBean.html" title="InitializingBean" >InitializingBean</a> et <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/DisposableBean.html" title="DisposableBean" >DisposableBean</a>.</p><p>Ces annotations sont disponibles en standard dans le jdk6. Si vous utilisez le jdk5, vous devrez obtenir le jar à cet <a
href="http://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/" title="url" >url</a> ou si vous utilisez maven, la dépendance à ajouter est la suivante javax.annotation:jsr250-api:1.0.</p><p>JPA de son côté introduit lui aussi quelques annotations supportées par Spring : <a
href="http://java.sun.com/javaee/5/docs/api/javax/persistence/PersistenceUnit.html" title="@PersistenceUnit" >@PersistenceUnit</a> qui permet l&#8217;injection d&#8217;un <a
href="http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManagerFactory.html" title="EntityManagerFactory" >EntityManagerFactory</a> et <a
href="http://java.sun.com/javaee/5/docs/api/javax/persistence/PersistenceContext.html" title="@PersistenceContext" >@PersistenceContext</a> (ou @PersistentContext{+}s+) pour l&#8217;injection d&#8217;un <a
href="http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html" title="EntityManager" >EntityManager</a>.</p><h4><a
name="LesannotationsspcifiquesSpring"></a>Les annotations spécifiques Spring</h4><p>Spring permet aussi l&#8217;utilisation de l&#8217;annotation <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html" title="@Autowired" >@Autowired</a> qui lui est propre. Cette annotation fonctionne comme le <a
href="http://java.sun.com/javase/6/docs/api/javax/annotation/Resource.html" title="@Resource" >@Resource</a> sauf qu&#8217;ici Spring fera de l&#8217;injection &#8216;by-type&#8217; c&#8217;est à dire en se basant sur la classe du bean à injecter. Il n&#8217;est ici pas possible de préciser un nom de bean explicitement. Il est par contre possible d&#8217;utiliser l&#8217;annotation <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Qualifier.html" title="@Qualifier" >@Qualifier</a> pour permettre à Spring de choisir la bonne dépendance. Avec cette annotation on précise des qualifiers à la fois sur les beans managés et sur les attributs ou sur les méthodes où Spring doit injecter des dépendances : Spring trouvera le meilleur candidat à l&#8217;injection en s&#8217;aidant de ces qualifiers si besoin.</p><p>Pour déclarer une dépendance comme obligatoire, on utilisera l&#8217;attribut required de l&#8217;annotation <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html" title="@Autowired" >@Autowired</a>.</p><p>Pour faciliter le travail du transaction manager, l&#8217;annotation <a
href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html" title="@Transactional" >@Transactional</a> peut être positionnée sur une classe ou sur les méthodes qui la composent pour préciser à Spring quelles méthodes doivent s&#8217;exécuter dans une transaction (sans oublier d&#8217;ajouter &lt;tx:annotation-driven transaction-manager=&nbsp;&raquo;txManager&nbsp;&raquo;/&gt; avec votre fichier de configuration XML). L&#8217;annotation prend plusieurs attributs permettant de configurer le comportement transactionnel à appliquer.</p><h3><a
name="AtonencorebesoindefichierXML"></a>A-t-on encore besoin de fichier XML ?</h3><p>Avec l&#8217;introduction des annotations, a-t-on encore besoin de fichiers XML pour configurer Spring ? La réponse est bien sûr &#8216;oui&#8217; puisqu&#8217;il reste nécessaire pour configurer la prise en compte des annotations. Cependant, ces annotations permettent de beaucoup simplifier et d&#8217;alléger le fichier de configuration. Seul le strict nécessaire subsistera : la configuration et la déclaration des ressources communes à tous les beans ainsi que la création des beans que nous ne développons pas (et donc sur lesquels nous ne pouvons pas positionner d&#8217;annotations).</p><p>Notamment, la configuration et l&#8217;utilisation d&#8217;AOP ainsi que la déclaration du transaction manager, d&#8217;Hibernate ou de JPA sont les éléments qui peuvent rester dans le fichier de configuration XML classique.</p><h3><a
name="Ressources"></a>Ressources</h3><ul><li><a
href="http://www.infoq.com/articles/spring-2.5-part-1" title="http://www.infoq.com/articles/spring-2.5-part-1" >http://www.infoq.com/articles/spring-2.5-part-1</a></li><li><a
href="http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config" title="http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config" >http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config</a></li><li><a
href="http://www.springframework.org/schema/context/spring-context-2.5.xsd" title="http://www.springframework.org/schema/context/spring-context-2.5.xsd" >http://www.springframework.org/schema/context/spring-context-2.5.xsd</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/08/08/simplifiez-votre-configuration-spring-25-avec-les-annotations/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>La prise de mesure en AOP avec JAMon</title><link>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/</link> <comments>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/#comments</comments> <pubDate>Wed, 02 May 2007 14:18:10 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[AOP]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Performance]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/</guid> <description><![CDATA[Voici un article qui propose une solution pour effectuer des mesures de performance en s'appuyant sur l'AOP (Aspect Oriented Programmation). L'exemple suivant propose d'utiliser l'implémentation <a
href="http://www.eclipse.org/aspectj/">AspectJ</a> couplée avec l'outil Open Source <a
href="http://jamonapi.sourceforge.net">JAMon</a>.]]></description> <content:encoded><![CDATA[<p>Voici un article qui propose une solution pour effectuer des mesures de performance en s&#8217;appuyant sur l&#8217;AOP (Aspect Oriented Programmation). L&#8217;exemple suivant propose d&#8217;utiliser l&#8217;implémentation <a
href="http://www.eclipse.org/aspectj/">AspectJ</a> couplée avec l&#8217;outil Open Source <a
href="http://jamonapi.sourceforge.net">JAMon</a>.</p><p>J&#8217;ai assisté, il y a peu, à une excellente présentation de l&#8217;AOP et de AspectJ plus particulièrement. J&#8217;ai tout de suite été séduit et j&#8217;ai donc cherché des applications pratiques pour ce genre de technologie.<br
/> Le cas d&#8217;école pour apprendre l&#8217;AOP que l&#8217;on trouve régulièrement est l&#8217;exemple du logging.</p><pre class="brush: java; title: ; notranslate">
public aspect LoggerAspect {
	pointcut log() : call(* *.methodToLog(..));
	before() : log() {
		System.out.println(&quot;Avant l'exécution de&quot;+thisJoinPoint.toShortString()) ;
	}
	after() : log() {
		System.out.println(&quot;Après l'exécution de&quot;+thisJoinPoint.toShortString()) ;
	}
}
</pre><p>Cet aspect affiche un message avant et après l&#8217;appel de la méthode.</p><p>Je vous propose ici de modifier cet exemple pour effectuer des mesures de performance dans une application.<br
/> Pour cela nous pouvons utiliser <a
href="http://jamonapi.sourceforge.net">JAMon</a> qui permet de positionner simplement des prises de mesure et de les consulter au travers d&#8217;une application web fournie. Dans JAMon, on utilise des <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/Monitor.html">Monitor</a> auquel on associe un nom logique.</p><p>Pour notre prise de mesure, nous voulons savoir combien de temps on passe dans telle ou telle partie de code. A la différence de l&#8217;exemple du login, le pointcut que nous allons définir va utiliser le mot-clé <em>execution</em> plutot que <em>call</em> pour se positionner au plus près du code exécuté.</p><p>La définition du _poincut_ sera d&#8217;autant plus simple si le code que l&#8217;on doit monitorer a été contraint par des règles de nommage ou si les éléments du code utilise ou hérite d&#8217;un framework.</p><p>Exemple :</p><pre class="brush: java; title: ; notranslate">
pointcut monitor() : execution(* *.*Service.*(..)) ; // Correspond à toutes les méthodes des classes qui finissent par &lt;em&gt;Service&lt;/em&gt;
pointcut monitor() : execution(* *.GenericService+.*(..)) ; // Correspond à toutes les méthodes des classes qui héritent de la classe &lt;em&gt;GenericService&lt;/em&gt;
pointcut monitor() : execution(* *.services.*.add*(..)) ; // Correspond à toutes les méthodes qui commencent par &lt;em&gt;add&lt;/em&gt; des classes qui sont dans le package *.services.*
</pre><p>Ensuite, Il faut définir l&#8217;<em>advice</em>. Nous voulons savoir combien de temps prend l&#8217;exécution des méthodes correspondant au pointcut. Nous utiliserons donc le mot-clé <em>arround()</em> qui permet d&#8217;effectuer des pré\- et post-traitements.</p><p>Puisque nous allons positionner ces prises de mesure avec de l&#8217;AOP, nous utiliserons <em>thisJointPoint.toShortString()</em> (qui donne le nom court du pointcut) comme nom pour le Monitor JAMon que nous positionnerons.</p><p>Voici l&#8217;exemple complet :</p><pre class="brush: java; title: ; notranslate">
public aspect PerfMonitor {
	pointcut monitor() : execution(* *.ClassToMonitor.methodToMonitor(..)) ;
	Object arround() : monitor() {
		Monitor monitor = MonitorFactory.start(thisJoinPoint.toShortString());
		Object returnedObject = proceed();
		monitor.stop();
		// Si on veut avoir une trace de la mesure dans les logs
		// LogFactory.getLog(getClass()).debug(monitor.toString()) ;
		return returnedObject;
	}
}
</pre><p>Une fois, notre aspect définit, nous allons pouvoir voir ce que donne notre prise de mesure.</p><p>La distribution de JAMon contient une application web qui permet de visualiser les statistiques des différents Monitor positionnés dans le code.</p><p>Pour que cela fonctionne simplement, il suffit de déposer le fichier jamon.jar dans le répertoire de librairie partagée (ex: common/lib sous Tomcat) afin que les classes de JAMon soient chargées par le &laquo;&nbsp;system class loader&nbsp;&raquo;. Ensuite, déployer l&#8217;application web <em>jamon.war</em> comme n&#8217;importe quelle application.</p><p>Une fois votre application démarrée, vous pouvez accéder à la page <em>http://webserver/jamon/jamonadmin.jsp</em> pour voir les statistiques produites par le monitoring de votre code.</p><p
align="center">Voici un exemple du rendu de cette page :<br
/> <a
href="http://blog.xebia.fr/wp-content/uploads/2007/05/jamon-screenshot.jpg" title="JAMon"><img
src="http://blog.xebia.fr/wp-content/uploads/2007/05/jamon-screenshot.miniature.jpg" alt="JAMon" /></a></p><p>Remarque : JAMon fournit d&#8217;autres possibilités de prise de mesure :</p><ul><li>le <a
href="http://jamonapi.sourceforge.net/#ServletFilter" target="_blank">ServletFilter JAMon</a> qui va mesurer le temps de chargement de chaque page  pour avoir un aperçu global des performances de l&#8217;application.</li><li>le <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/proxy/JAMonDriver.html" target="_blank">JAMonDriver</a> ou la <a
href="http://jamonapi.sourceforge.net/javadoc/com/jamonapi/proxy/JAMonDataSource.html" target="_blank">JAMonDataSource</a> qui encapsule le vrai driver JDBC pour mesurer les accès à la base de données.</li></ul><p>Ce genre d&#8217;outil est surtout en mode &laquo;&nbsp;diagnostic&nbsp;&raquo; pour trouver et optimiser les traitements coûteux plutôt que pour effectuer de véritables tests de performance sur une application.<br
/> L&#8217;avantage de le combiner avec de l&#8217;AOP, c&#8217;est de permettre de « monitorer » des traitements dont nous n&#8217;avons pas le code source.</p><p>L&#8217;outil <a
href="http://www.glassbox.com" target="_blank">Glassbox</a> qui permet de faire des prises mesures automatiquement dans une application se base justement sur l&#8217;AOP pour positionner ses messures.</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/05/02/la-prise-de-mesure-en-aop-avec-jamon/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Configuration en Annotations Java ou en XML ?</title><link>http://blog.xebia.fr/2007/04/07/configuration-en-annotations-java-ou-en-xml/</link> <comments>http://blog.xebia.fr/2007/04/07/configuration-en-annotations-java-ou-en-xml/#comments</comments> <pubDate>Sat, 07 Apr 2007 12:28:09 +0000</pubDate> <dc:creator>Manuel Eveno</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[annotation]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[XML]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/04/07/configuration-en-annotations-java-ou-en-xml/</guid> <description><![CDATA[L&#8217;arrivée de Guice dans le monde des frameworks de dependency injection a entraîné pas mal de questionnements. Je n&#8217;échappe pas à la règle ! Google a adopté dans Guice la configuration tout en Java : tout ce fait à base d&#8217;annotations et de l&#8217;API. De fait, il n&#8217;y a plus de fichier de configuration XML. [...]]]></description> <content:encoded><![CDATA[<p>L&#8217;arrivée de Guice dans le monde des frameworks de dependency injection a entraîné pas mal de questionnements. Je n&#8217;échappe pas à la règle !</p><p>Google a adopté dans Guice la configuration tout en Java : tout ce fait à base d&#8217;annotations et de l&#8217;API. De fait, il n&#8217;y a plus de fichier de configuration XML.</p><p>C&#8217;est encore un des reproches que l&#8217;on entend sur Spring : on déporte beaucoup de choses dans un fichier XML qui ne compile pas et pour lequel on n&#8217;est pas assisté.</p><p>Dans le même ordre d&#8217;idée, Les nouvelles annotations créées avec JPA (Java Persistence API) changent aussi notre façon de configurer Hibernate. Avant, on configurait tout dans le bon vieux hibernate.cfg.xml, maintenant on a la possibilité de le faire avec les annotations.</p><p>Maintenant que nous avons le choix : quelle solution doit-on préférer ? Java ou XML ?</p><h2>Configuration en Java (API + Annotations)</h2><h3>Pour</h3><ul><li><strong>Compilation</strong> (vérification des liens et de l&#8217;existence des classes par le compilateur)</li></ul><div
style="margin-left: 40px">Ceci permet de limiter les mauvaises configurations (ou plutôt de s&#8217;en rendre compte avant d&#8217;être obligé de tester) mais aussi de garantir la cohérence du modèle objet (implémentation, héritage, etc). Si on injecte une classe incompatible avec le type attendu, la compilation nous le signifie rapidement.</div><ul><li><strong>Code-completion</strong></li></ul><div
style="margin-left: 40px">L&#8217;approche Java permet de réduire les risques de faute de frappe : les IDE nous assiste dans l&#8217;écriture du code. On atteint un certain niveau de productivité.</div><ul><li><strong>Simplicité et concision</strong> (par rapport au XML)</li></ul><div
style="margin-left: 40px">Le fait de positionner l&#8217;annotation directement dans la classe concernée, nous évite de devoir décrire la classe dans le fichier XML, pour que le framework qui analyse le fichier ait toutes les informations pour effectuer son traitement.</div><ul><li><strong>Refactoring simple</strong></li></ul><div
style="margin-left: 40px">Nous sommes dans le monde Java, dans un IDE, il est plus simple de faire du refactoring que dans un mode mixte Java / XML.</div><h3>Contre</h3><ul><li><strong>Tout changement entraîne une recompilation</strong></li></ul><div
style="margin-left: 40px">Si je veux exposer mon service en WebService, je dois ajouter l&#8217;annotation @WebService par exemple dans le code et recompiler. Qui dit recompilation, dit tests de non-regression &#8230;</div><ul><li><strong>Configuration répartie dans le code</strong></li></ul><div
style="margin-left: 40px">Imaginons que j&#8217;ai configuré tous mes services en Web Service. Dans chaque service, je trouve l&#8217;annotation @WebService par exemple.<br
/> Si, plus tard je veux finalement changer l&#8217;exposition de tous mes services vers une exposition RMI / IIOP, il faut que je parcours tout le code (avec les risques d&#8217;omission) pour remplacer l&#8217;annotation.</div><h2>Configuration en XML</h2><h3>Pour</h3><ul><li><strong>Souplesse</strong> : Permet d&#8217;effectuer des changements sans impact sur le code (et sans recompilation)</li></ul><div
style="margin-left: 40px">Exemple avec Spring :<br
/> Mes deux services communique en appel Java (intra JVM) et je veux maintenant qu&#8217;il communique en RMI.<br
/> Je n&#8217;ai qu&#8217;à modifier le fichier de configuration de Spring pour changer l&#8217;exposition du service et changer l&#8217;injection pour l&#8217;appelant.</div><ul><li><strong>Pas de couplage fort du code avec le framework</strong></li></ul><div
style="margin-left: 40px">L&#8217;avantage de passer par un configuration XML, c&#8217;est qu&#8217;il n&#8217;apparaît pas (ou peu) de trace du framework utilisé dans mon code.</div><ul><li><strong>Configuration centralisée</strong></li></ul><div
style="margin-left: 40px">Les changements se font à un seul endroit (au sens d&#8217;un seul fichier ou d&#8217;un seul répertoire qui contient l&#8217;ensemble des fichiers de configuration).</div><h3>Contre</h3><ul><li><strong>Perte de lisibilité</strong></li></ul><div
style="margin-left: 40px">Puisque les dépendances sont définies à part dans un fichier XML, ceci nous oblige à passer du code Java à XML mais sans assistance (sauf la fonction « rechercher » de l&#8217;éditeur) : ici, pas de Ctrl+Click pour naviguer dans les éléments.</div><ul><li><strong>Source d&#8217;erreur</strong></li></ul><div
style="margin-left: 40px">Il n&#8217;y a pas de validation sémantique du XML (vérification de l&#8217;existence des classes, de la validité des assignations de type, etc). Avec notre fichier XML, ce n&#8217;est qu&#8217;au moment du test de l&#8217;application (runtime) que l&#8217;on sait si la configuration est bonne. On n&#8217;ignore pas qu&#8217;on est parti pour une petite session d&#8217;arrêts / modifications / relances.<br
/> Lourdeur et perte de productivité (beaucoup de choses à écrire en XML)<br
/> Il n&#8217;y a pas ou peu d&#8217;assistance à l&#8217;écriture du XML, notamment quand on doit renseigner des références à des éléments du source Java (noms de classe Java, de méthodes, etc).</div><ul><li><strong>Refactoring manuel</strong> (Search &#038; Replace)</li></ul><div
style="margin-left: 40px">Le refactoring ne peut se faire qu&#8217;avec le concours de la fonction « remplacer » de l&#8217;éditeur, avec les risques d&#8217;erreur que cela entraine.</div><h2>En synthèse</h2><table
cellspacing="20" cellpadding="0" style="border: 0px solid black"><tr><td
style="border: 0px solid black"></td><td
bgcolor="#663366" style="color: #ffffff"><strong>Configuration en Java</strong></td><td
bgcolor="#663366" style="color: #ffffff"><strong>Configuration en XML</strong></td></tr><tr><td><strong>Les plus</strong></td><td><ul><li>Compilation</li><li>Productivité</li></ul></td><td><ul><li>Indépendance du code et du framework</li><li>Configuration centralisée</li></ul></td></tr><tr><td><strong>Les moins</strong></td><td><ul><li>Couplage fort</li><li>Pollution du code</li></ul></td><td><ul><li>Lisibilité</li><li>Validation runtime</li></ul></td></tr></table> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/04/07/configuration-en-annotations-java-ou-en-xml/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
