<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Jsatriani's Weblog Technology</title>
	<atom:link href="http://jsatriani.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jsatriani.wordpress.com</link>
	<description>Vitrine da Alta Tecnologia</description>
	<pubDate>Tue, 17 Jun 2008 13:14:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>pt-br</language>
			<item>
		<title>Curso on-line de Flex + Vídeos</title>
		<link>http://jsatriani.wordpress.com/2008/06/12/curso-on-line-de-flex-videos/</link>
		<comments>http://jsatriani.wordpress.com/2008/06/12/curso-on-line-de-flex-videos/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 21:22:23 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[Diversos]]></category>

		<category><![CDATA[Curso]]></category>

		<category><![CDATA[FLEX]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=33</guid>
		<description><![CDATA[Só repassando, daqui algumas semanas ocorrerá mais uma boa oportunidade para o desenvolvimento Flex, A e-Genial ta promovendo um curso on-line. O curso terá 18 aulas/horas e irá iniciar em Agosto, vamos fazer a matrícula:
Curso On-Line de Flex e Vídeos (streaming)
Você já pode baixar a grade, e ao termino será feito uma aplicação exemplo.
  [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal" style="line-height:normal;">Só repassando, daqui algumas semanas ocorrerá mais uma boa oportunidade para o desenvolvimento Flex, A <a href="http://www.egenial.com.br/" target="_blank"><span style="color:blue;">e-Genial</span></a> ta promovendo um curso on-line. O curso terá 18 aulas/horas e irá iniciar em Agosto, vamos fazer a matrícula:</p>
<p class="MsoNormal" style="line-height:normal;"><a href="http://blog.egenial.com.br/?p=153" target="_blank"><span style="color:blue;">Curso On-Line de Flex e Vídeos (streaming)</span></a></p>
<p class="MsoNormal" style="line-height:normal;">Você já pode baixar a <a href="http://www.egenial.com.br/arquivos/GradeDoCursoFlexVideos.pdf"><span style="color:blue;">grade</span></a>, e ao termino será feito uma aplicação exemplo.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=33&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/06/12/curso-on-line-de-flex-videos/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>
	</item>
		<item>
		<title>Introspecção Performance: Java x ActionScript3</title>
		<link>http://jsatriani.wordpress.com/2008/06/10/introspeccao-performance-java-x-action-script3/</link>
		<comments>http://jsatriani.wordpress.com/2008/06/10/introspeccao-performance-java-x-action-script3/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 13:04:45 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[FLEX]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Add new tag]]></category>

		<category><![CDATA[AS3]]></category>

		<category><![CDATA[introspection]]></category>

		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=14</guid>
		<description><![CDATA[Bom, hoje vou falar um pouco de um recurso muito importante no desenvolvimento de aplicações, que é o processo pelo qual se pode obter informações sobre a estrutura e comportamento do programa em tempo de execução, de uma maneira estreitamente dependente das características de abstração do código, ou seja, o programa tem a habilidade para [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal" style="text-align:justify;">Bom, hoje vou falar um pouco de um recurso muito importante no desenvolvimento de aplicações, que é o processo pelo qual se pode obter informações sobre a estrutura e comportamento do programa em tempo de execução, de uma maneira estreitamente dependente das características de abstração do código, ou seja, o programa tem a habilidade para “observar” e possivelmente modificar a estrutura e comportamento. Levando em consideração esse conceito vou mostrar como esse pode ser aplicado tanto na linguagem <a href="http://java.sun.com/">Java</a> como em <a href="http://en.wikipedia.org/wiki/ActionScript">ActionScript3(AS3)</a>.</p>
<p class="MsoNormal" style="text-align:justify;">Em AS3 ultilizada no desenvolvimento <a href="http://www.adobe.com/products/flex/">Flex</a>, reflexão é referenciada como <em>object introspection</em> (introspecção de Objeto). Existem duas formas de introspecção em AS3: Usando o laço <strong><em>for&#8230;in</em></strong> e a <strong><em>API </em>introspecção<em>.</em></strong> Em Java esta atividade é auxiliada pelo pacote <em>java.lang.reflect.</em> É bom deixar bem claro que a API introspecção em ActionScript não é tão avançada como em Java, porem permite você ler métodos, propriedades e invocar métodos de objetos em tempos de execução, tao bem quanto. Bom, chega de conversa e mãos a obra.</p>
<p class="MsoNormal" style="text-align:justify;">Para nosso exemplo vamos definir nossa classe que ira servir como base para fazer nossos testes, precisamos de duas classes uma em Java .class e outra em ActionScript .as:</p>
<p class="MsoNormal" style="text-align:center;"><a href="http://jsatriani.files.wordpress.com/2008/06/class-pessoa.jpg"><img class="alignnone size-medium wp-image-15 aligncenter" src="http://jsatriani.files.wordpress.com/2008/06/class-pessoa.jpg?w=190&h=190" alt="" width="190" height="190" /></a></p>
<p class="MsoNormal" style="text-align:left;">
<p class="MsoNormal" style="text-align:justify;">Vamos por parte, primeiramente aprender como pegar a definição de classe e logo em seguida criar uma instancia da mesma, primeiro em Java:</p>
<div style="background:silver;"><code>...<br />
Class classePessoa = Class.forName(&#8221;Pessoa&#8221;);<br />
Object instance = classePessoa.newInstance();<br />
&#8230;</code></div>
<p class="MsoNormal" style="text-align:justify;">Muito fácil não? Em ActionScript é mais fácil ainda, com a utilização do método <em>getDefinitionByName() </em>definido em<em> flash.utils, </em>onde contem diversas funções de manipulação de classes e objetos em tempo de execução, podemos criar uma definição de classe<em>.</em></p>
<div style="background:silver;"><code>...<br />
var classePessoa: Class = <strong>getDefinitionByName</strong>(&#8221;Pessoa&#8221;) as Class;<br />
var instance = new classePessoa ();<br />
&#8230;</code></div>
<p class="MsoNormal" style="text-align:justify;">Agora Vamos tentar recuperar a estrutura do Objeto Pessoa em tempo de execução, primeiro em Java:</p>
<div style="background:silver;"><code>Class classePessoa = Class.forName("Pessoa");<br />
String str=&#8221;";<br />
<strong>for </strong>(Field field : classePessoa.getDeclaredFields()) {<br />
str+=&#8221;Variaveis: &#8220;+<br />
field.getName()+<br />
&#8220;=(&#8221;+field.getType().getSimpleName()+<br />
&#8220;)&#8221;+<br />
&#8220;\n&#8221;;<br />
}<br />
<strong>for </strong>(Method method : classePessoa.getDeclaredMethods()) {<br />
str+=&#8221;Metodo: &#8220;+<br />
method.getName()+<br />
&#8220;=(&#8221;+method.getReturnType()+<br />
&#8220;)&#8221;+<br />
&#8220;\n&#8221;;<br />
}<br />
System.<strong>out</strong>.println(str);</code></div>
<p class="MsoNormal" style="text-align:justify;">Agora o processo em ActionScript, é feito com a utilização do <strong>for..in</strong> e a função <em>describeType() </em>que vem também no pacote <em>flash.utils, </em> recebe como parâmetro o objeto a ser introspectivo sobre um retorno descrito em XML do tipo do objeto e toda sua estrutura:</p>
<div style="background:silver;"><code><strong>var </strong>ClassePessoa:Class = getDefinitionByName(&#8221;Pessoa&#8221;) as Class;<br />
<strong>var </strong>classInfo:XML = <strong>describeType</strong>(classePessoa);<br />
<strong>var </strong>str:String=&#8221;;<br />
<strong> for each</strong> (var v:XML <strong>in </strong>classInfo..variable) {<br />
str += &#8220;Variavel: &#8221; + v.@name + &#8220;=&#8221; + &#8221; (&#8221; + v.@type + &#8220;)\n&#8221;;              }<br />
<strong> for each</strong> (var v:XML <strong>in </strong>classInfo..method) {<br />
str += &#8220;Metodo: &#8221; + v.@name + &#8220;=&#8221; +   &#8221; (&#8221; + v.@returnType + &#8220;)\n&#8221;;<br />
}<br />
<strong>trace</strong>(str);</code></div>
<p class="MsoNormal" style="text-align:justify;">Abas imprimem o seguinte trace:</p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">Variavel : nome=(String)</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">Variavel : nacionalidade=(String)</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">Variavel : idade=(String)</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">Metodo: falar=(void)</span></strong><strong></strong></p>
<p class="MsoNormal" style="text-align:justify;"><strong><span style="font-size:10pt;line-height:115%;">Metodo: ouvir=(void)</span></strong></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span style="color:black;">Outra coisa muito utilizada quando se utiliza reflexão e invocação de métodos por definição explicita de assinatura e parâmetro, em Java podemos criar um objeto Method a partir do <em>getMethod()</em> passando o nome do método como parâmetro, e em seguida utilizar seu método <em><span>invoke() </span></em>, passando o objeto, e parâmetro, no argumento:</span></p>
<div style="background:silver;"><code>...<br />
Class classePessoa = Class.forName(&#8221;Pessoa&#8221;);<br />
Method m = classePessoa.getMethod(&#8221;falar&#8221;, null);<br />
m.<strong>invoke</strong>(classePessoa.newInstance(), null);<br />
&#8230;</code></div>
<p><span style="color:black;">Em ActionScript é um pouco diferente, pois o tipo <em>Object</em> é uma classe dinâmica então não precisamos fazer o hard-code do método para que o metodo seja invocado, basta fazer instanciar com <strong>new</strong> e invocar explicitamente.</span></p>
<div style="background:silver;"><code>var classePessoa:Class = getDefinitionByName("Pessoa") as Class;<br />
var instance:Object = new classePessoa()<br />
instance["falar"](); //</code> <em>ou </em><strong><em><code>instance.falar(); </code></em></strong><em><code>os dois sao equivalentes</code></em><strong><em><code><br />
</code></em></strong></div>
<p class="MsoNormal" style="text-align:justify;"><span style="color:black;">Um outro método muito utilizado na introspecção AS3 é o <em>getClassInfo()</em>, no qual retorna um objeto com nome e propriedades do mesmo e o toString() que retorna uma espécie de “mapa” do Objeto, todos dois da classe <em>ObjetoUtils</em>.</span></p>
<div style="background:silver;"><code>...<br />
var o:Object = ObjectUtil.<strong>getClassInfo</strong>(Pessoa);<br />
trace(ObjectUtil.<strong>toString</strong>(o));<br />
&#8230;</code></div>
<p class="MsoNormal" style="text-align:justify;"><span style="color:black;">Bom, espero ter colaborado para um entendimento do que vem a ser introspecção de objetos e como se comporta em cada uma das linguagens, tanto em Java quando em AS3, podendo ser uma técnica poderosa no desenvolvimento de soluções um tanto quanto genéricas.</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=14&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/06/10/introspeccao-performance-java-x-action-script3/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>

		<media:content url="http://jsatriani.files.wordpress.com/2008/06/class-pessoa.jpg?w=190" medium="image" />
	</item>
		<item>
		<title>RIA com Java: BlazeDS e AMF</title>
		<link>http://jsatriani.wordpress.com/2008/06/04/ria-com-java-blazeds-e-amf/</link>
		<comments>http://jsatriani.wordpress.com/2008/06/04/ria-com-java-blazeds-e-amf/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 13:13:55 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[FLEX]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[AMF]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=12</guid>
		<description><![CDATA[Ultimamente com o uso de ferramentas como Adobe Flex, Flash CS3 vem crescendo muito o numero de Rich Internet Applications (RIA), aplicações desktop com o Adobe AIR e aqueles que rodam em browser com Flash Player atuando como client-side, que por sua vez tem que de alguma forma se comunicar com um servidor para leitura [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal" style="text-align:justify;">Ultimamente com o uso de ferramentas como <a href="http://www.adobe.com/products/flex/?promoid=BPDEQ">Adobe Flex</a>, <a href="http://www.adobe.com/products/flash/?promoid=BPDEE">Flash CS3</a> vem crescendo muito o numero de <strong><em>Rich Internet Applications</em></strong><span> (RIA)</span>, aplicações desktop com o <a href="http://get.adobe.com/air/?promoid=BUIGQ">Adobe AIR</a> e aqueles que rodam em browser com <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&amp;promoid=BUIGP">Flash Player</a> atuando como <em>client-side</em>, que por sua vez tem que de alguma forma se comunicar com um servidor para leitura e manipulação de dados, dados esses que geralmente são transportados via HTTP, mas a diferença em como esses dados são passados pelo protocolo pode comprometer drasticamente a performance, bem como a produtividade no desenvolvimento dos sistemas.</p>
<p class="MsoNormal" style="text-align:justify;">Muitas dessas aplicações utilizam-se de XML-sobre-HTTP para a comunicação cliente-servidor e acabam se dando conta da carga que sistema sofre com a serialização e deserialização dos XMLs que correm de um lado para outro.</p>
<p class="MsoNormal" style="text-align:justify;">O Action Message Format(AMF) se trata de um protocolo binário que pode ser usado sobre o HTTP ao invés do XML, evitando o tempo de parse entre a comunicação com o servidor. Nesse intuito, a Adobe tratou de lanca o tantas vezes renomeado <a href="http://www.adobe.com/products/livecycle/?promoid=BPDEO">LiveCycle Data Service</a>, que prove as APIs necessárias para o <em>server-side</em> trabalhar com o AMF. Porém, não muito difundido pelos desenvolvedores por ser uma ferramenta liberada apenas para um único servidor(CPU) como demonstração. Em dezembro de 2007 a Adobe anuncio que a especificação AMF seria liberada e uma poção do LiveCycle Data Service seria open-source denominado <a href="http://labs.adobe.com/technologies/blazeds/">BlazeDS</a> que incluiria a implementação Java de AMF em servidores de aplicação como: <a href="http://tomcat.apache.org/">Tomcat</a>, <a href="http://www.jboss.org/">JBoss</a>, <a href="http://www.bea.com/products/weblogic/server/index.shtml">WebLogic</a>, <a href="http://http://www-306.ibm.com/software/websphere/">WebSphere</a>, etc.</p>
<p class="MsoNormal" style="text-align:justify;">James Ward e Shashank Tiwari publicaram um artigo que explica em detalhes todo esse processo e a criação de um exemplo com <em>back-end</em> Java com o BlazeDS sobre o desenvolvimento Flex para um cliente RIA.</p>
<p class="MsoNormal" style="text-align:justify;">O artigo pode ser encontrado <a href="http://www.infoq.com/articles/blazeds-intro">aqui</a> postado na infoQ.<a href="http://www.infoq.com/articles/blazeds-intro"></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=12&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/06/04/ria-com-java-blazeds-e-amf/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>
	</item>
		<item>
		<title>Comunicação entre componentes distribuídos por mensagens assíncronas com MDB</title>
		<link>http://jsatriani.wordpress.com/2008/06/02/comunicacao-entre-componentes-distribuidos-por-mensagens-assincronas-com-mdb/</link>
		<comments>http://jsatriani.wordpress.com/2008/06/02/comunicacao-entre-componentes-distribuidos-por-mensagens-assincronas-com-mdb/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 15:28:39 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[Diversos]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[EJB3]]></category>

		<category><![CDATA[JMS]]></category>

		<category><![CDATA[MDB]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=8</guid>
		<description><![CDATA[Após um tempo estudando Enterprise JavaBeans (EJB’s) para um projeto em que estava participando, percebi que estava confuso em relação ao conceito do tipo de ambiente(arquitetura) que o Beans de Sessão(Sessions Beans) são utilizados, pois cheguei a seguinte situação; queria que meu cliente acessasse por JNDI serviços registrados em outro servidor remoto e esses me [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal"><span>Após um tempo estudando <a href="http://java.sun.com/products/ejb/"><em>Enterprise JavaBeans</em></a> (EJB’s) para um projeto em que estava participando, percebi que estava confuso em relação ao conceito do tipo de ambiente(arquitetura) que o Beans de Sessão(<em>Sessions Beans)</em> são utilizados, pois cheguei a seguinte situação; queria que meu cliente acessasse por <a href="http://java.sun.com/products/jndi/">JNDI </a>serviços registrados em outro servidor remoto e esses me devolviam informações(objetos) de um sistema heterogêneo , sendo que o mesmo estava em uma outra rede de uma filial da empresa, interligadas por uma WAN, ou seja, queria uma interação direta e síncrona entre meus componentes. Mas essa solução não é adequada por uma serie de condições adversas tais como: Link esta fora, servidor remoto parar no meio de uma transação, pico de luz e etc. A não ser que meu cliente espere longos 30min para receber apenas um <em>timeout </em>como resposta de uma conexão falha, nem mesmo quando pode voltar a estabelecer uma nova conexão com esse servidor. Então, como sair dessa situação? Depois de muito queimar a ‘cuca‘, encontramos a resposta na seguinte solução: </span></p>
<p class="MsoNormal"><span>Invocar serviços através mensagens assíncronas, monitoradas por um tipo de especial de EJB denominado <em><a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts5.html">Message Driven Bean</a> </em><span>(MDB)</span>. Antes de começar explicar, vou explanar alguns conceitos importantes da solução apresentada:</span></p>
<ul type="disc">
<li class="MsoNormal"><em><span>MDB</span></em><span style="font-size:12pt;">: </span><span>São      beans consumidores de JMS dentro do container <a href="http://java.sun.com/javaee/">JEE</a>.</span></li>
<li class="MsoNormal"><em><span>Queue</span></em><span>: Filas de mensagens onde só      vai ser consumida por um único MDB.</span></li>
<li class="MsoNormal"><em><span>Producer</span></em><span>: Produtor de mensagens para      um <em>Provider</em> JMS.</span></li>
<li class="MsoNormal"><em><span>Consumer</span></em><span>: Recebe as mensagens de uma      <em>Queue</em> que esta &#8216;escutando&#8217;.</span></li>
<li class="MsoNormal"><em><span>Provider</span></em>: Ambiente responsável pela organização e entrega de <a href="http://java.sun.com/products/jms/">JMS</a>.</li>
</ul>
<p class="MsoNormal"><span> O Conceito do funcionamento de uma <em>JMS</em> <em>Application</em> pode ser muito bem ilustrada na figura abaixo:</span></p>
<p class="MsoNormal" style="text-align:justify;line-height:normal;">
<p class="MsoNormal" style="text-align:justify;line-height:normal;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><a href="http://jsatriani.files.wordpress.com/2008/05/mdb1.png"><img class="alignnone size-medium wp-image-9" src="http://jsatriani.files.wordpress.com/2008/05/mdb1.png?w=300&h=184" alt="" width="300" height="184" /></a></p>
<p class="MsoNormal"><span>Isso nos trouxe mais confiança à comunicação entre nossos componentes distribuídos, pois não temos que nos preocupar em “busca coisas” em serviços de um servidor remoto, pois ele se encarrega de enviá-los através de um <em>Producer</em> construído somente para empilhar mensagens em uma <em>Queue</em>, escutada pelo nosso <em>Consumer</em> em um servidor local. O processando das mensagens é forma ordenada e durável, ou seja, somente sai da fila quando for realmente processada na ordem de chegada. Então a disposição de comunicação de nossos componentes ficou da seguinte forma:</span></p>
<p class="MsoNormal" style="text-align:justify;"><a href="http://jsatriani.files.wordpress.com/2008/05/mbd2.png"><img class="alignnone size-medium wp-image-10" src="http://jsatriani.files.wordpress.com/2008/05/mbd2.png?w=300&h=184" alt="" width="300" height="184" /></a></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal"><span>A grande sacada foi como um MDB acessa uma Queue remota e fazer com que minhas mensagens sejam consistentes o bastante para garantirem a entrega no meu <em>Consumer</em>. Para isso foi feito algumas configurações no <a href="http://www.jboss.org/">JBoss</a>(no meu caso v.405), primeiramente foi adicionado mais um <em>mbean</em>(<span class="postbody"><em>Managed Bean</em></span>) em &lt;$JBOSS_HOME/server/&lt;your-configuration&gt;/deploy/jms/jms-ds.xml, que  defini um <em>Provider</em> remoto (que pode ser gerenciado via <a href="http://java.sun.com/products/JavaManagement/">jmx</a>-console). Lembrando esta alteração é no container em que o MDB esta rodando. Por padrão todos os MDBs acessam o <em>DefaultJMSProvider</em> também declarado no arquivo como <em>Provider</em>.</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">mbean </span><span style="font-size:8pt;" lang="EN-US">code</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;org.jboss.jms.jndi.JMSProviderLoader&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span><span> </span></span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;jboss.mq:service=JMSProviderLoader,name=RemoteJMSProvider,server=remotehost&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;ProviderName&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span><span style="font-size:8pt;" lang="EN-US">RemoteJMSProvider</span><span style="font-size:8pt;" lang="EN-US">&lt;/</span><span style="font-size:8pt;" lang="EN-US">attribute</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;ProviderAdapterClass&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span><span style="font-size:8pt;" lang="EN-US">org.jboss.jms.jndi.JNDIProviderAdapter</span><span style="font-size:8pt;" lang="EN-US">&lt;/</span><span style="font-size:8pt;" lang="EN-US">attribute</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;!&#8211; The connection factory &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;FactoryRef&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span><span style="font-size:8pt;" lang="EN-US">UIL2XAConnectionFactory</span><span style="font-size:8pt;" lang="EN-US">&lt;/</span><span style="font-size:8pt;" lang="EN-US">attribute</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;!&#8211; The queue connection factory &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;QueueFactoryRef&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span><span style="font-size:8pt;" lang="EN-US">UIL2XAConnectionFactory</span><span style="font-size:8pt;" lang="EN-US">&lt;/</span><span style="font-size:8pt;" lang="EN-US">attribute</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;!&#8211; The topic factory &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;TopicFactoryRef&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span><span style="font-size:8pt;" lang="EN-US">UIL2XAConnectionFactory</span><span style="font-size:8pt;" lang="EN-US">&lt;/</span><span style="font-size:8pt;" lang="EN-US">attribute</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;!&#8211; Connect to JNDI on the host &#8220;the-remote-host-name&#8221; port 1099&#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;" lang="EN-US">&lt;</span><span style="font-size:8pt;" lang="EN-US">attribute </span><span style="font-size:8pt;" lang="EN-US">name</span><span style="font-size:8pt;" lang="EN-US">=</span><span style="font-size:8pt;" lang="EN-US">&#8220;Properties&#8221;</span><span style="font-size:8pt;" lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span>java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span>java.naming.factory.url.pkgs=org.jnp.interfaces</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span>java.naming.provider.url=<strong>the-remote-host-name</strong>:1099</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:8pt;" lang="EN-US"><span> </span></span><span style="font-size:8pt;">&lt;/</span><span style="font-size:8pt;">attribute</span><span style="font-size:8pt;">&gt;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span style="font-size:8pt;">&lt;/</span><span style="font-size:8pt;">mbean</span><span style="font-size:8pt;">&gt;</span></p>
<p class="MsoNormal"><span> Troque “the-remote-host-name” para o <a href="http://pt.wikipedia.org/wiki/Endereço_IP">IP </a>do servidor que a <em>Queue</em> se encontra. E para fazer com que o MDB consuma de um <em>provider </em>remoto é mais fácil ainda:</span></p>
<div style="background:silver;"><code>@MessageDriven(activateConfig =<br />
{<br />
@ActivationConfigProperty(propertyName=&#8221;destinationType&#8221;, propertyValue=&#8221;javax.jms.Queue&#8221;),<br />
@ActivationConfigProperty(propertyName=&#8221;destination&#8221;, propertyValue=&#8221;queue/testQueue&#8221;),<br />
@ActivationConfigProperty(propertyName=&#8221;providerAdapterJNDI&#8221;, propertyValue=&#8221;java:/RemoteJMSProvider&#8221;)<br />
})<br />
public class MDB implements MessageListener<br />
{<br />
&#8230;<br />
}</code></div>
<p class="MsoNormal"><span> Agora para garantir com que as mensagens fossem persistentes. Definimos o envio do nosso <em>Producer</em> maneira persistente:</span></p>
<div style="background:silver;"><code><br />
QueueSender sender = session.createSender(myQueue);<br />
Message message = session.createTextMessage(&#8221;hello&#8221;);<br />
int priority = 4;<br />
<strong>sender.send(message, DeliveryMode.PERSISTENT, priority, 0);</strong></code></div>
<p class="MsoNormal"><span>Fazendo isto, garantimos a entrega da mensagem para o MDB pelo menos uma vez após uma exceção, se tornar a persistir, a mensagem é levada para o DLQ (ou mais conhecida como “lixão”), mas para que isso não ocorra você pode indicar que não quer tratamento de DLQ utilizando <strong><em>useDQL</em></strong><em>, </em>desta forma, sempre ira tentar entregar a mensagem sem retirar da <em>Queue </em>enquanto houver exceção. Outra configuração que pode fazer também é numero de vezes que ele vai tentar entregar antes de mandar para DLQ o <strong><em>DLQMaxResent. </em></strong><span>A configuração do MDB pode ficar da seguinte forma:</span></span></p>
<div style="background:silver;"><code><br />
@MessageDriven(activateConfig =<br />
{<br />
@ActivationConfigProperty(propertyName=&#8221;destinationType&#8221;, propertyValue=&#8221;javax.jms.Queue&#8221;),<br />
@ActivationConfigProperty(propertyName=&#8221;destination&#8221;, propertyValue=&#8221;queue/testQueue&#8221;),<br />
@ActivationConfigProperty(propertyName=&#8221;useDLQ&#8221;, propertyValue=&#8221;true&#8221;),<br />
@ActivationConfigProperty(propertyName=&#8221;DLQMaxResent&#8221;, propertyValue=&#8221;100&#8243;),<br />
@ActivationConfigProperty(propertyName=&#8221;providerAdapterJNDI&#8221;, propertyValue=&#8221;java:/RemoteJMSProvider&#8221;)<br />
})<br />
public class MDB implements MessageListener<br />
{<br />
&#8230;<br />
}</code></div>
<p class="MsoNormal"><span> Fiquei muito satisfeito com a facilidade de criação de aplicações desse tipo e ainda existe uma <a href="http://wiki.jboss.org/wiki/ConfigJMSMessageListener">serie de configurações</a> que podem ser feitas customizando a utilização de um MDB aumentando ainda mais a escalabilidade de sistemas, pois de uma solução JMS não se resume apenas apresentação unilateral de comunicação entre componentes, mais de uma interação substancial de processos definidos em uma margem de requisitos do funcionamento do sistema como um todo, tornando-o como uma ferramenta essencial na aplicação de grandes projetos.</span></p>
<p class="MsoNormal"><span>Bom, vou ficando por aqui espero ter colaborado da alguma forma para o entendimento de aplicações JMS com MDB boa sorte e ate à próxima.</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=8&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/06/02/comunicacao-entre-componentes-distribuidos-por-mensagens-assincronas-com-mdb/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>

		<media:content url="http://jsatriani.files.wordpress.com/2008/05/mdb1.png?w=300" medium="image" />

		<media:content url="http://jsatriani.files.wordpress.com/2008/05/mbd2.png?w=300" medium="image" />
	</item>
		<item>
		<title>Relatórios em Flex? Jasper4Flex pode ser uma opção</title>
		<link>http://jsatriani.wordpress.com/2008/05/16/relatorios-em-flex-jasper4flex-pode-ser-uma-opcao/</link>
		<comments>http://jsatriani.wordpress.com/2008/05/16/relatorios-em-flex-jasper4flex-pode-ser-uma-opcao/#comments</comments>
		<pubDate>Fri, 16 May 2008 17:18:15 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[FLEX]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Report]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=7</guid>
		<description><![CDATA[Recentemente por uma iniciativa de Teodor Danciu, foi desenvolvido mais uma opção de renderização de relatórios feitos em jasper, so que desta vez em swf, ou seja, para desenvolvimento Flex, conhecido como Jasper4Flex, o mesmo possui algumas peculiaridades em relação ao FlexReport, pois constitui base jasper server-side, então toda a geração do relatório ocorre no [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoBodyText" style="text-align:justify;"><span>Recentemente por uma iniciativa de </span><a href="http://www.jasperforge.org/sf/global/do/viewUser/teodord">Teodor Danciu</a><span>, foi desenvolvido mais uma opção de renderização de relatórios feitos em jasper, so que desta vez em swf, ou seja, para desenvolvimento </span><span><a href="http://www.adobe.com/products/flex/">Flex</a></span><span>, conhecido como </span><a href="http://www.jasperforge.org/sf/projects/jasper4flex">Jasper4Flex</a><span>, o mesmo possui algumas peculiaridades em relação ao </span><a href="http://flexreport.riaforge.org/">FlexReport</a><span>, pois constitui base jasper </span><strong><span>server-side</span></strong><span>, então toda a geração do relatório ocorre no servidor jasper seguido de um </span><strong><span>parser</span></strong><span> Jasper4Flex, feito por um servlet registrado no </span><em><span>deploy descriptor:</span></em></p>
<p class="western" style="margin-bottom:0;" align="justify"><em></em></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><strong>web.xml</strong></p>
<p class="western" style="margin-bottom:0;" align="justify">&#8230;.</p>
<p class="western" style="margin-bottom:0;" align="justify"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">servlet</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">servlet-name</span><span style="color:#008080;">&gt;</span><span style="color:#000000;">SwfServlet</span><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">servlet-name</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">servlet-class</span><span style="color:#008080;">&gt;</span><span style="color:#000000;">net.sf.jasperreports.j2ee.servlets.SwfServlet</span><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">servlet-class</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">servlet</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="color:#000000;"><span style="font-family:Courier New;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">servlet-mapping</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#000000;"> </span><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">servlet-name</span><span style="color:#008080;">&gt;</span><span style="color:#000000;">SwfServlet</span><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">servlet-name</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-family:Courier New;"><span style="font-size:x-small;"><span style="color:#000000;"> </span><span style="color:#008080;">&lt;</span><span style="color:#3f7f7f;">url-pattern</span><span style="color:#008080;">&gt;</span><span style="color:#000000;">/servlets/swf</span><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">url-pattern</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="left"><span style="font-size:x-small;"><span style="font-family:Courier New;"><span style="color:#008080;">&lt;/</span><span style="color:#3f7f7f;">servlet-mapping</span><span style="color:#008080;">&gt;</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">&#8230;&#8230;</p>
<p class="western" style="margin-bottom:0;" align="justify">Em poucas linhas podemos fazer nossa chamada apartir de um servlet.</p>
<p class="western" style="margin-bottom:0;" align="justify">
<div style="background:silver;"><code>JasperPrint impressao = JasperFillManager.<br />
fillReport(&#8221;Report_exemplo.jasper&#8221;, parametros,conn);<br />
HttpSession session  =   request.getSession();<br />
session.<br />
setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, impressao);<br />
response.sendRedirect(&#8221;servlets/swf&#8221;);</code></div>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="MsoBodyText" style="margin-bottom:0.0001pt;text-align:justify;"><span>Neste caso foi criado um servlet para testar o exemplo. O código, não tem muito mistério a única diferença está, em como esse servlet vai responder essa requisição direcionando &#8217;servlets/swf&#8217;. O resto o jasper4Flex se encarrega de fazer. Estou ate satisfeito com os testes que tenho feito ate agora. Mais o projeto é muito recente? Sim, eu sei mais a comunidade esta ai pra isso, testar, motivar e colaborar. Vejo isso como mais um incentivo a desenvolvedores que querem usar projetos </span><span><a href="http://java.sun.com/">Java</a></span><span> em </span><strong><em><span>front-end</span></em></strong><strong><span> </span></strong><span>Flex. Os exemplos podem ser baixados <a href="http://sourceforge.net/project/showfiles.php?group_id=36382">aqui</a> no site do projeto.<br />
</span>
</p>
<p class="western" style="margin-bottom:0;" align="justify"><span> </span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=7&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/05/16/relatorios-em-flex-jasper4flex-pode-ser-uma-opcao/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>
	</item>
		<item>
		<title>Injeção de Dependência e o Google GUICE</title>
		<link>http://jsatriani.wordpress.com/2008/05/12/4/</link>
		<comments>http://jsatriani.wordpress.com/2008/05/12/4/#comments</comments>
		<pubDate>Mon, 12 May 2008 20:33:21 +0000</pubDate>
		<dc:creator>jsatriani</dc:creator>
		
		<category><![CDATA[Diversos]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Add new tag]]></category>

		<category><![CDATA[DI]]></category>

		<category><![CDATA[Guice]]></category>

		<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://jsatriani.wordpress.com/?p=4</guid>
		<description><![CDATA[Segundo Martin Fowler todo e qualquer conteiner leve deve por si só implementar Inversão de Controle (Inversion of Control, ou IoC), definidos por três possíveis formas de Injeção de Dependência (DI), constructor Injection (Injeção por Construtores), Setter Injection (Injeção por Métodos Set) e Interface Injection (Injeção por Interfaces), a DI está relacionada ao baixo acoplamento [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="western" style="margin-bottom:0;" align="justify">Segundo <span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://martinfowler.com/bliki/InversionOfControl.html">Martin Fowler</a></span></span> todo e qualquer conteiner leve deve por si só implementar <span style="color:#000000;">Inversão de Controle </span><em><span style="color:#000000;">(Inversion of Control, ou IoC)</span></em><span style="color:#000000;">,</span> definidos por três possíveis formas de Injeção de Dependência (DI), <em>c</em><em><span style="color:#000000;">onstructor Injection </span></em><span style="color:#000000;">(Injeção por Construtores), </span><em><span style="color:#000000;">Setter Injection </span></em><span style="color:#000000;">(Injeção por Métodos Set) e </span><em><span style="color:#000000;">Interface Injection </span></em><span style="color:#000000;">(Injeção por Interfaces), a DI está relacionada ao baixo acoplamento de diferentes componentes de seu sistema e como acessar o mesmos não por uma chamada direta e sim por uma “injeção” do conteiner, hoje existem vários conteiner leves que fazem essas implementações como </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.picocontainer.org/">PicoContainer</a></span></span><span style="color:#000000;">, </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.springframework.org/">Spring,</a></span></span><span style="color:#000000;"> </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://avalon.apache.org/">Avalon</a></span></span><span style="color:#000000;">. O </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://code.google.com/p/google-guice/">Guice</a></span></span><span style="color:#000000;"> criado pelos “</span><em><span style="color:#000000;">Googlers</span></em><span style="color:#000000;">” </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://crazybob.org/">Bob Lee</a></span></span><span style="color:#000000;"> e </span><a href="http://smallwig.blogspot.com"><span style="color:#000080;"><span style="text-decoration:underline;">Kevin Bourrillion</span></span></a><span style="color:#000000;"> traz como principal característica um conteiner puramente DI, suportando injeção via <em>c</em></span><em><span style="color:#000000;">onstructor</span></em><span style="color:#000000;"> e s</span><em><span style="color:#000000;">etter <span style="font-style:normal;">e</span></span></em><span style="color:#000000;"> podendo funcionar somente com anotações ou se preferir, construir módulos para definir os bind entre objetos.</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;"><strong>DI, Guice Style</strong></span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Diferentemente do clássico </span><span style="color:#000000;">pattern </span><span style="color:#000000;"><a title="Factory" href="http://en.wikipedia.org/wiki/Factory_method_pattern">Factory</a> que traz a instância de uma implementação, quando se trata de DI ocorre a inversão desse controle e o </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://code.google.com/p/google-guice/">Guice</a></span></span> <span style="color:#000000;">simplifica com uma simples anotação @Inject dizendo onde o conteiner vai injetar.</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 1.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> Cliente {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">private</span></strong><span style="color:#000000;"> Service </span><span style="color:#0000c0;">service</span><span style="color:#000000;">;</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><span style="color:#646464;">@Inject</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> Cliente(Service service) {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">this</span></strong><span style="color:#000000;">.</span><span style="color:#0000c0;">service</span><span style="color:#000000;"> = service;</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> }</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> getMyService(){</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><span style="color:#0000c0;">service</span><span style="color:#000000;">.getService();</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"><span> </span>}</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">No Code 1 acima usa-se uma injeção por construtor.<strong> </strong>O mais interessante é a configuração de dependência:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 2.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#646464;">@ImplementedBy</span><span style="color:#000000;">(ServiceImpl.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">)</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">interface</span></strong><span style="color:#000000;"> Service {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"> <span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> getService();</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#646464;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">@Singleton</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> ServiceImpl </span><strong><span style="color:#0000a0;">implements</span></strong><span style="color:#000000;"> Service {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span><span style="color:#000000;"> </span></span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> getService() {</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> System.</span><em><span style="color:#0000c0;">out</span></em><span style="color:#000000;">.println(</span><span style="color:#2a00ff;">&#8220;Metodo getService foi chamado&#8221;</span><span style="color:#000000;">);</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> }</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Pronto, agora podemos testar o nosso exemplo a partir da classe Cliente do Code 1, as anotações @ImplementedBy define sua implementação de classe eliminando qualquer código, e a @Singleton define o escopo de implementação por padrão o Guice cria uma instância a cada chamada.</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 3.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> App {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">static</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> main(String[] args) {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> Injector guiceInj = Guice.<em>createInjector</em>(</span><strong><span style="color:#0000a0;">new</span></strong><span style="color:#000000;"> Module[0]);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"><span> </span>Cliente c = guiceInj.getInstance(Cliente.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> c.getMyService ();</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> }</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify">Se tivermos sorte nosso Code 3 irá imprimir <span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#2a00ff;">&#8220;Metodo getService foi chamado&#8221;</span><span style="color:#000000;">,</span></span></span><span style="color:#000000;"> é claro podemos também definir nosso bind explicitamente por construção de módulos:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 4.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> MyModule </span><strong><span style="color:#0000a0;">implements</span></strong><span style="color:#000000;"> Module {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> configure(Binder binder) {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> binder.bind(Service.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).to(ServiceImpl.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).in(Scopes.SINGLETON);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> }</span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">&#8230;..</span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;">Injector guiceInj = Guice.<em>createInjector</em>(</span><strong><span style="color:#0000a0;">new</span></strong><span style="color:#000000;"> <strong>MyModule</strong>());</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"><span> </span>Cliente c = guiceInj.getInstance(Cliente.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> c.getMyService ();</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">&#8230;&#8230;</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">O Code 4 mostra que um único metodo da interface é definido com um objeto Bind, podendo ser usado para definir sua especial sintaxe que pode ser lido da seguinte forma: “Amarra interface Service a implementação ServiceImpl no escopo Singleton”. Ate ai tudo bem, mais como sair da situação onde temos mais de uma implementação para nossa Service.class? Podemos também utilizar o <strong>AbstractModule</strong> para fazer nossa subclasse. A mesma implementa a interface Module e não define argumento no metodo configure, sigamos o exemplo com essa implementação:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 5.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> MyModule </span><strong><span style="color:#0000a0;">extends</span></strong><span style="color:#000000;"> <strong>AbstractModule</strong> {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> configure() {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> bind(Service.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).to(ServiceImpl.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> bind(Service.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).to(ServiceImplNew.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"><span> </span>}</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Provavelmente quando for executar esse Code 5 irá ocorrer um erro de execução, pois o </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://code.google.com/p/google-guice/">Guice</a></span></span> <span style="color:#000000;">não trabalha desta forma, então como sair dessa situação?  Simples, basta fazer um bind com anotação da seguinte forma:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" lang="en-US" align="justify"><span style="color:#000000;">Code 6.</span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> MyModule </span><strong><span style="color:#0000a0;">extends</span></strong><span style="color:#000000;"> <strong>AbstractModule</strong> {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">void</span></strong><span style="color:#000000;"> configure() {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> bind(Service.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).to(ServiceImpl.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> bind(Service.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).annotateWith(Marca.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">).to(ServiceImplNew.</span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;">);</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"><span> </span>}</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;">}</span></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Isso mesmo, podemos definir um bind com uma marcação anotada em uma determinada requisição, vamos a sintaxe lendo da esquerda para direita: “Amarra todas as requisições para a interface Service anotado com @Marca para a implementação ServiceImpl”, porém a anotação @Marca deve ser criada programaticamente com a seguinte estrutura:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<table border="1" cellspacing="0" cellpadding="4" width="100%"><col width="128*"></col> <col width="128*"></col></p>
<thead>
<tr valign="top">
<th width="50%">
<p class="western">Code</p>
</th>
<th width="50%">
<p class="western">Explanation</p>
</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td width="50%">
<p class="western" align="justify">@Retention(RetentionPolicy.RUNTIME)</p>
</td>
<td width="50%">
<p class="western" align="justify">Anotação em tempo 				de execução</p>
</td>
</tr>
<tr valign="top">
<td width="50%">
<p class="western" align="justify">@Target({ElementType.FIELD,ElementType.PARAMETER})</p>
</td>
<td width="50%">
<p class="western" align="justify">Onde pode ser colocada</p>
</td>
</tr>
<tr valign="top">
<td width="50%">
<p class="western" align="justify">@BindingAnnotation</p>
</td>
<td width="50%">
<p class="western" align="justify">Informa que é uma 				anotaçao &#8216;binding&#8217;</p>
</td>
</tr>
<tr valign="top">
<td width="50%">
<p class="western" align="justify">Public @interface Marca{}</p>
</td>
<td width="50%">
<p class="western" align="justify">Como é declarada</p>
</td>
</tr>
</tbody>
</table>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Feito isso basta definir como marcação:</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">class</span></strong><span style="color:#000000;"> Cliente {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US">
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">private</span></strong><span style="color:#000000;"> Service </span><span style="color:#0000c0;">service</span><span style="color:#000000;">;</span></span></span></span></p>
<p class="western" style="margin-bottom:0;" lang="en-US"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><span style="color:#646464;">@Inject</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span style="color:#000000;"> </span><strong><span style="color:#0000a0;">public</span></strong><span style="color:#000000;"> Cliente(</span><span style="color:#646464;">@Marca</span><span style="color:#000000;"> Service service) {</span></span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;"><span><span style="color:#000000;"> </span></span><strong><span style="color:#0000a0;">this</span></strong><span style="color:#000000;">.</span><span style="color:#0000c0;">service</span><span style="color:#000000;"> = service;</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> }</span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"><span style="font-family:Andale Mono,MS Mincho;"><span style="font-size:x-small;"> </span></span></span></p>
<p class="western" style="margin-bottom:0;"><span style="color:#000000;"> &#8230;&#8230;</span></p>
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;">Bom, explorando mais a fundo o </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://code.google.com/p/google-guice/">Guice</a></span></span> <span style="color:#000000;">podemos encontrar inúmeras funcionalidades como <span style="font-size:x-small;"><span style="font-family:Andale Mono,MS Mincho;">bindInterceptor, Aspect-Oriented Programming (AOP), Integrating Web(Struts 2, Wicket)</span></span> entre outros, onde pode ou não trazer benefícios para sua arquitetura, isso vai depender muito do que você precisa e com que você esta trabalhando. Anteriormente em muitos fóruns já foi discutido isso, e muita gente não se sente muito confortável de como o </span><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://code.google.com/p/google-guice/">Guice</a></span></span> <span style="color:#000000;">trabalha, porém, temos que concordar que não há muito que refazer com o que já foi feito só nos resta a escolha. Boa sorte a todos e espero que eu tenha ajudado de alguma forma com esse meu primeiro post.</span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000000;"><strong>Referencias:</strong></span></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://martinfowler.com/bliki/InversionOfControl.html">http://martinfowler.com/bliki/InversionOfControl.html</a></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.javafree.org/content/view.jf?idContent=1">http://www.javafree.org/content/view.jf?idContent=1</a></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify"><span style="color:#000080;"><span style="text-decoration:underline;"><a href="http://www.apress.com/book/view/9781590599976">http://www.apress.com/book/view/9781590599976</a></span></span></p>
<p class="western" style="margin-bottom:0;" align="justify"><a href="http://code.google.com/p/google-guice/"><span class="a">http://code.google.com/p/google-<strong>guice</strong>/</span></a></p>
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;" align="justify">
<p class="western" style="margin-bottom:0;">
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/jsatriani.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/jsatriani.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jsatriani.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsatriani.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jsatriani.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jsatriani.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jsatriani.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jsatriani.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jsatriani.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jsatriani.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jsatriani.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jsatriani.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsatriani.wordpress.com&blog=3661851&post=4&subd=jsatriani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jsatriani.wordpress.com/2008/05/12/4/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/jsatriani-128.jpg" medium="image">
			<media:title type="html">jsatriani</media:title>
		</media:content>
	</item>
	</channel>
</rss>