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

<channel>
	<title>Gilliard Cordeiro &#187; CDI</title>
	<atom:link href="http://blog.gilliard.eti.br/tag/cdi/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gilliard.eti.br</link>
	<description>tá nervoso? vai programar!</description>
	<lastBuildDate>Wed, 21 Sep 2011 05:22:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Final</title>
		<link>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/</link>
		<comments>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/#comments</comments>
		<pubDate>Tue, 25 May 2010 18:30:56 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=254</guid>
		<description><![CDATA[Depois da parte 1 e parte 2, chegamos à parte final do nosso exemplo. Disponibilizei o código e vou mostrar mais algumas coisas. Só uma observação sobre o código: é o mesmo utilizado na apresentação de 14 de Novembro de 2009, quando ainda não tínhamos as mesmas versões de hoje. Mas o exemplo é totalmente [...]]]></description>
			<content:encoded><![CDATA[<p>Depois da <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">parte 1</a> e <a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/">parte 2</a>, chegamos à parte final do nosso exemplo. Disponibilizei o <a href="http://blog.gilliard.eti.br/arquivos/javaneiros-weld.zip">código</a> e vou mostrar mais algumas coisas.<br />
Só uma observação sobre o código: é o mesmo utilizado na apresentação de 14 de Novembro de 2009, quando ainda não tínhamos as mesmas versões de hoje. Mas o exemplo é totalmente funcional. Acabei deixando fixa a versão no pom.xml, então para testar a última versão você vai ter que alterá-lo.</p>
<p>Agora voltando ao post&#8230;</p>
<p><br/></p>
<h3>Alternatives</h3>
<p><br/></p>
<p>Alternatives são a forma de trocarmos um objeto por outro. É parecido com um decorator, mas em vez de incrementar funcionalidades, um alternative serve para substituir um bean.</p>
<p>No nosso exemplo, temos o seguinte objeto como alternativa ao nosso CaixaEletronico:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Alternative
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaEletronicoSubstituto <span style="color: #000000; font-weight: bold;">extends</span> CaixaEletronico<span style="color: #009900;">&#123;</span>
&nbsp;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@@@@@@ CaixaEletronicoMock.depositar():&quot;</span> <span style="color: #339933;">+</span> valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@@@@@@ CaixaEletronicoMock.sacar():&quot;</span> <span style="color: #339933;">+</span> valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>E para habilitar temos que mudar novamente nosso META-INF/beans.xml:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.CaixaDecorator<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;alternatives<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.model.CaixaEletronicoSubstituto<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/alternatives<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>Agora se executarmos nosso código a saída sera:</p>
<pre>
hello
CaixaDecorator.sacar()
@@@@@@ CaixaEletronicoMock.sacar():200.0
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2000.0
CaixaDecorator.depositar()
@@@@@@ CaixaEletronicoMock.depositar():300.0
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2000.0
</pre>
<p><br/></p>
<p>Como podemos ver, nosso decorator decora o alternative e o interceptor continua funcionando normalmente.<br />
Podemos também declarar uma anotação própria e anotá-la como alternative. Mas em vez de tentar explicar, vou mostrar um outro exemplo que servirá como base para este.</p>
<p><br/></p>
<h3>Estereótipos próprios</h3>
<p><br/></p>
<p>Podemos criar nossos próprios estereótipos, e dessa forma não só reduzir a quantidade de anotações em cima dos nossos beans, mas também deixar a leitura das anotações mais condizentes com nosso linguajar do dia a dia.</p>
<p>Vamos pegar como exemplo o nosso objeto ContaBancaria:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
@ApplicationScoped
@Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//o código já foi visto antes</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Já vimos este código e o corpo da classe não tem relação com o que vamos ver agora. Agora o mais importante é observarmos as anotações. Temos duas, mas poderíamos ter mais. Para deixar isso mais limpo e com mais significado no meu negócio, poderia criar um estereótipo próprio como o seguinte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">TYPE</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">RetentionPolicy</span>.<span style="color: #006633;">RUNTIME</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Retention</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Target</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.inject.Stereotype</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
@ApplicationScoped
@Seguro
@Stereotype
@Target<span style="color: #009900;">&#40;</span>TYPE<span style="color: #009900;">&#41;</span>
@Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> JavaneirosBean <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>E depois mudar nosso ContaBancaria deixando ele assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
@JavaneirosBean
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//o código já foi visto antes</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Com isso o resultado será o mesmo de antes. Nosso objeto ContaBancaria é @Seguro e @ApplicationScoped. Além disso se depois quisermos dizer que nosso @JavaneirosBean é também um @Alternative ou qualquer outro estereótipo pré-existente ou mesmo um outro estereótipo customizado, basta anotar nossa anotação @JavaneirosBean com a anotação desejada.</p>
<p>Pode parecer estranho usarmos anotações de anotações, mas para exemplificar, se a JPA suportasse isso eu poderia ter uma anotação @Entidade que seria uma @Entity (JPA) e ao mesmo tempo @Named (CDI) e assim poder utilizá-la diretamente nas minhas view JSF com uma única anotação.</p>
<p><br/></p>
<h3>Conceitos gerais</h3>
<p><br/></p>
<p>Eu disse que ao final do exemplo iria entrar mais na parte teórica de como a CDI trata mais extamente a injeção de dependência, seleção de candidatos etc. Porém por questão de organização, vou deixar isso em um post separado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Parte 2</title>
		<link>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/</link>
		<comments>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/#comments</comments>
		<pubDate>Tue, 25 May 2010 15:09:52 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=241</guid>
		<description><![CDATA[Continuando então no nosso exemplo, vamos comentar mais sobre a &#8220;parte prática&#8221; do exemplo e depois eu comento mais sobre os tipos de injeção que a CDI faz. E só pra contextualizar, quando eu disse &#8220;ejeção&#8221; no último post, não quer dizer que a CDI tem um @Out como o Seam, e sim que ele [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando então no nosso exemplo, vamos comentar mais sobre a &#8220;parte prática&#8221; do exemplo e depois eu comento mais sobre os tipos de injeção que a CDI faz. E só pra contextualizar, quando eu disse &#8220;ejeção&#8221; no <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">último post</a>, não quer dizer que a CDI tem um @Out como o Seam, e sim que ele tem uma forma de produzir objetos para um determinado escopo assim como um @Factory do Seam ou Spring. </p>
<p><br/></p>
<h3>Interceptors</h3>
<p><br/></p>
<p>No final do <a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">ultimo post</a> vimos que nossa <code>ContaBancaria</code> estava anotada com @Seguro. Essa é uma anotação da nossa aplicação:</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">METHOD</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">ElementType</span>.<span style="color: #006633;">TYPE</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">annotation</span>.<span style="color: #006633;">RetentionPolicy</span>.<span style="color: #006633;">RUNTIME</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Retention</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Target</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.InterceptorBinding</span><span style="color: #339933;">;</span>
&nbsp;
@InterceptorBinding
@Target<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span> METHOD, TYPE <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
@Retention<span style="color: #009900;">&#40;</span>RUNTIME<span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> Seguro <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>No meio de um monte de anotações percebemos a que define nossa anotação como uma @InterceptorBinding. Agora basta anotar quem queremos interceptar com a mesma anotação usada na definição do interceptor (@Seguro) para &#8220;bindar&#8221; interceptador e interceptado.</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.AroundInvoke</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.Interceptor</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.interceptor.InvocationContext</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
@Interceptor @Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaInterceptor <span style="color: #009900;">&#123;</span>
&nbsp;
	@AroundInvoke
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> protege<span style="color: #009900;">&#40;</span>InvocationContext context<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ContaInterceptor.protege(antes) &gt;&gt; &quot;</span> <span style="color: #339933;">+</span> context.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">Object</span> object <span style="color: #339933;">=</span> context.<span style="color: #006633;">proceed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ContaInterceptor.protege(depois) &gt;&gt; &quot;</span> <span style="color: #339933;">+</span> context.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> object<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Esse é o nosso interceptador. Olhando o código quase não preciso explicar nada. Aqui coloquei Conta no meio do nome porque é uma aplicação de exemplo, mas na prática poderia ter um uso mais genérico. Esse código tem o jeitão de um interceptador comum. O método &#8220;protege&#8221; está anotado com @AroundInvoke, e isso me dá o poder de envolver, e com isso até mesmo trocar a implementação original do objeto interceptado. É bem parecido com <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_aspecto">AOP</a>. Mas a regra do <a href="http://pt.wikipedia.org/wiki/Ben_Parker">tio Ben</a> se aplica aqui também: <em>&#8220;Grandes poderes trazem grandes responsabilidades&#8221;</em>! Então isso não serve para ficar adicionando regra de negócio na aplicação, senão depois você não vai achar mais nada no sistema e vai falar que viu isso aqui. A idéia de um interceptor é prover funcionalidades ortogonais para o sistema, assim como AOP. Então se você não gosta de AOP ou interceptor é provavelmente porque está colocando código no local errado.</p>
<p>Nesse exemplo usei para prover segurança, protegendo meus objetos marcados com @Seguro. Mas minha implementação simplesmente mostra no console que o nosso método foi chamado.</p>
<p>Além de interceptors, temos <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorators</a>, que veremos daqui a pouco. Mas para já ter uma idéia da diferença, o interceptor geralmente é para requisitos não funcionais, enquanto os decorators adicionam funcionalidades em objetos do nosso sistema. Mas o foco aqui não é padrões de projeto, então para saber mais basta dar uma pesquisada. O que importa para o contexto desse post é que tanto interceptors quanto decorators não estão habilitados por padrão. Para colocá-los para rodar precisamos &#8220;ligá-los&#8221; no arquivo /META-INF/beans.xml. Abaixo vemos como fica nosso arquivo com esse interceptor ligado.</p>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>Eu sei que sou repetitivo, mas mais uma vez eu digo: não precisamos habilitar beans injetáveis ou gerenciáveis quando usamos CDI. Basta que os objetos estejam em um bean package para tudo acontecer, e um bean package é um módulo (jar, projeto, etc) que tenha um arquivo /META-INF/beans.xml vazio (só com cabeçalho). Pronto, só precisa disso. As exceções são para interceptors, decorators e alternatives (esse ultimo falo depois). Esses sim precisam ser habilitados.</p>
<p>Agora que já temos tudos os arquivos, executando a aplicação temos a seguinte saída:</p>
<pre>
hello
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
1800.0
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2100.0
</pre>
<p>Como estamos usando @AroundInvoke, colocamos uma mensagem antes e uma depois de cada método.</p>
<p><br/></p>
<h3>Decorators</h3>
<p><br/></p>
<p>Agora que vimos o interceptor, fica mais fácil entendermos o decorator. Vamos ao código</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.intercept</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.decorator.Decorator</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.decorator.Delegate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.CaixaEletronico</span><span style="color: #339933;">;</span>
&nbsp;
@Decorator
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaDecorator <span style="color: #000000; font-weight: bold;">extends</span> CaixaEletronico <span style="color: #009900;">&#123;</span>
&nbsp;
	@Inject
	@<span style="color: #003399;">Delegate</span>
	<span style="color: #000000; font-weight: bold;">private</span> CaixaEletronico delegate<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CaixaDecorator.sacar()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		delegate.<span style="color: #006633;">sacar</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CaixaDecorator.depositar()&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		delegate.<span style="color: #006633;">depositar</span><span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><br/></p>
<p>Um decorator precisa ter condições de <a href="http://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov">substituir</a> o objeto original (extender, implementar mesma interface). Além disso temos o objeto original que é injetado através da anotação @Delegate juntamente com a @Inject. Aqui também podemos utilizar diversos estereótipos para &#8220;selecionar&#8221; o objeto a ser decorado. Como os demais exemplos dessa nossa aplicação, esse decorator é extremamente complexo ao printar no console que ele foi executado <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p>Agora basta adicionarmos ele no beans.xml:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee&quot;</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.ContaInterceptor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/interceptors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.jugms.weldse.intercept.CaixaDecorator<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/decorators<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/></p>
<p>E agora a saída no console é a seguinte:</p>
<pre>
hello
CaixaDecorator.sacar()
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
1800.0
CaixaDecorator.depositar()
ContaInterceptor.protege(antes) >> recebeMovimento
ContaInterceptor.protege(depois) >> recebeMovimento
ContaInterceptor.protege(antes) >> getSaldo
ContaInterceptor.protege(depois) >> getSaldo
2100.0
</pre>
<p><br/></p>
<p>Apesar da saída no console mostrar nosso decorator antes do nosso interceptor, isso é porque estamos decorando e interceptando coisas diferentes, pois decorators são chamados <strong>depois</strong> dos interceptors.</p>
<p>Em seguida posto como funcionam os alternatives e o que faltou colocar nesses dois primeiros posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo uma aplicação Desktop com Weld – Parte 1</title>
		<link>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/</link>
		<comments>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 15:06:56 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=196</guid>
		<description><![CDATA[Como havia comentado, em Novembro do ano passado eu apresentei uma palestra no Javaneiros, evento anual sobre Java organizado pelo JUGMS. Os slides eu já disponibilizei no post anterior, e agora vou de fato colocar aqui no blog o que mostrei na palestra, pois slides sem explicação não serve para muita coisa né? Como acho [...]]]></description>
			<content:encoded><![CDATA[<p>Como havia comentado, em Novembro do ano passado eu apresentei uma palestra no Javaneiros, evento anual sobre Java organizado pelo JUGMS. Os slides eu já disponibilizei no post anterior, e agora vou de fato colocar aqui no blog o que mostrei na palestra, pois slides sem explicação não serve para muita coisa né? </p>
<p>Como acho que um post só vai ficar muito grande, vou publicar o conteúdo em partes.</p>
<p><br/></p>
<h3>Intradução</h3>
<p><br/></p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi1.png" alt="" title="Vários nomes envolvidos na JSR-299" class="alignnone size-full wp-image-231" /></p>
<p>Primeiramente eu gostaria de explicar, para quem não está familiarizado, o que é a CDI. Hoje em dia está mais difundido que na época da palestra, mas até para manter a coerência com os slides vou comentar rapidamente alguma coisa. Se seu objetivo é ver código, pode pular esse tópico.</p>
<p>A CDI, ou &#8220;<strong>Context and Dependency Injection for the Java EE platform</strong>&#8221; é uma especificação que define uma forma padrão de trabalharmos com DI em aplicações Java. Pelo nome já vemos que ela é voltada para Java EE, mas está seguindo os mesmos passos da JPA, que foi introduzida no Java EE 5 mas é usada sem problemas em aplicações SE.</p>
<p>Talvez a coisa que valha mais a pena comentar antes de entrar na prática é o monte de nomes envolvidos nessa JSR. O primeiro &#8220;nome&#8221; é a própria identificação da JSR: &#8220;JSR-299&#8243;. Acho que até quem nunca foi ligado em número de JSR já ouviu falar dessa tal de 299. Para resumir a história, ela já se chamou WebBeans antes de se chamar CDI, e até hoje muita coisa na internet, principalmente as discussões iniciais você vai encontrar esse nome. Além disso tem a implementação de referência dela, que também já chamou WebBeans e agora é Weld. Ou seja, de WebBeans não sobrou nada.</p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi2.png" alt="" title="Evolução dos nomes na linha do tempo" class="aligncenter size-full wp-image-232" /></p>
<p>Outra coisa que veio dar uma cofundida nesses nomes foi a JSR-330, &#8220;<strong>Dependency Injection for Java</strong>&#8220;, que nada mais é do que a extração das anotações da CDI para uma especificação menor, tornando assim mais fácil que frameworks como Spring e Guice utilizem anotações padrão mesmo não sendo uma implementação da CDI. Isso gerou muita polêmica também, pois em tese a CDI já deveria ser mínima e não faz sentido alguém usar as anotações dela sem ter o mesmo comportamento. Mas isso já é outra história.</p>
<p><br/></p>
<h3>Ainda antes de começar&#8230;</h3>
<p><br/></p>
<p>A CDI sofreu muita influência do Seam e Guice, além é claro de não ser difícil de compreender para quem trabalha com Spring, pois no fim das contas os conceitos são os mesmos.</p>
<p>Uma premissa muito forte da CDI é a injeção de dependência &#8220;<em>type safe</em>&#8220;, o que já a diferencia bastante do Seam que trabalha muito com Strings. Nesse ponto já fica mais perto para quem trabalha com Spring do que quem tá acostumado com Seam.</p>
<p>Outra coisa que temos que ter em mente é que diferentemente do Spring ou Seam onde uma classe simples não é considerada uma candidata à injeção de dependência a menos que seja marcada (via xml ou anotação), na CDI se a classe está dentro de um <em>bean package</em> então ela automaticamente é elegível. Mas isso nós vamos ver na aplicação de exemplo.</p>
<p>Outra coisa que temos que ter em mente é que o objetivo da CDI não é substituir o Seam. O Seam tem um mundo de coisas como facilitadores para e-mail, pdf, bpm, segurança, jsf, etc. A CDI define apenas o core o que será o core do Seam 3, ou seja, a parte da DI, interceptors e mais algumas coisas. Então não vamos comparar coisas tão diferentes com comentários tipo &#8220;O Seam é muito melhor que o Weld. O Weld não faz nada, o Seam faz um monte de coisas&#8221;.</p>
<p><img src="http://blog.gilliard.eti.br/wp-content/uploads/2010/03/cdi3.png" alt="" title="Relação do Seam com Weld e CDI" class="aligncenter size-full wp-image-233" /></p>
<p>A primeira coisa que precisamos saber para trabalhar com a CDI é o que é um <em>bean package</em>. Na prática um <em>bean package</em> vai ser um jar (ou pode estar explodido mesmo) onde temos um arquivo <code>META-INF/beans.xml</code>. Se a CDI encontrar esse cara, ela escaneia tudo e considera todas classes dentro desse &#8220;<em>módulo</em>&#8221; como beans injetáveis. É análogo ao seam.properties, mas no caso do Seam ainda precisa ter a anotação ou estar no <em>components.xml</em> para a classe ser considerada.</p>
<p>Outra coisa que vamos ver no exemplo é que o mesmo se trata de uma aplicação SE de console. Aí nos perguntamos: mas no nome da especificação não fala que é para Java EE? Pois é, mas a especificação define também a criação de extensões portáveis. Isso quer dizer que você pode fazer uma extensão da CDI e rodar em qualquer implementação dela. Pois bem, o Weld tem uma extensão que permite que rodemos tudo isso num ambiente SE, porém com limitações, claro.</p>
<p><br/></p>
<h3>Agora vamos à pratica</h3>
<p><br/></p>
<p>O nosso exemplo é bem simples, e consiste em realizarmos um saque e um depósito em uma conta bancária via um caixa eletrônico. Para simplificar o exemplo, temos apenas uma conta e um caixa eletrônico.</p>
<p>Nossa aplicação inicia com a classe MovimentacaoControl.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.control</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jboss.weld.environment.se.events.ContainerInitialized</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.CaixaEletronico</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.model.ContaBancaria</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
@ApplicationScoped
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MovimentacaoControl<span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject <span style="color: #000000; font-weight: bold;">private</span> ContaBancaria contaBancaria<span style="color: #339933;">;</span>
    @Inject <span style="color: #000000; font-weight: bold;">private</span> CaixaEletronico caixaEletronico<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> executar<span style="color: #009900;">&#40;</span>@Observes ContainerInitialized init<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hello&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        caixaEletronico.<span style="color: #006633;">sacar</span><span style="color: #009900;">&#40;</span>200.0f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contaBancaria.<span style="color: #006633;">getSaldo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        caixaEletronico.<span style="color: #006633;">depositar</span><span style="color: #009900;">&#40;</span>300.0f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contaBancaria.<span style="color: #006633;">getSaldo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Como podemos ver essa classe possui a anotação @ApplicationScoped, mas essa anotação não serve para habilitar o gerenciamento dos objetos dessa classe, pois como eu disse anteriormente, isso é automático já que estamos em um bean package.</p>
<p>Essa classe também não possui um método main. Para executar o exemplo executamos a classe <code>org.jboss.weld.environment.se.StartMain</code>, e essa sim possui um método main, que inicializa todo o framework e quando termina de inicializar o container ele avisa lançando um evento do tipo <code>org.jboss.weld.environment.se.events.ContainerInitialized</code>. Para iniciarmos nossa aplicação, basta escutarmos esse evento como é feito no método &#8220;<code>executar</code>&#8220;. Deu para perceber que escutar um evento é algo muito complicado <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Nesse caso não faremos nada com o objeto init que é o que representa o evento, mas no decorrer do exemplo veremos como isso funciona.</p>
<p>No nosso exemplo, nós realizamos um saque de 200, depois olhamos o saldo, depositamos 300 e olhamos o saldo de novo. Parece bobo (e não vou negar isso), mas é útil para testarmos os diferentes escopos. Pois quando mudamos os scopos para stateless (default, sem a anotação @ApplicationScoped) percebemos que a conta sempre volta a ter o valor inicial.</p>
<p>Nesse exemplo estou trabalhando com classes, mas para trabalhar com interfaces o procedimento é o mesmo, ao ver que você pediu para injetar um objeto tipado por uma determinada interface a CDI vai procurar por uma implementação da mesma, e encontrando injeta. Agora se ela encontrar nenhuma ou mais de uma, aí será lançada uma excessão. &#8220;Poxa, mas e se eu tiver mais de uma implementação no bean package&#8221;? <a href="http://pt.wikipedia.org/wiki/El_Chapul%C3%ADn_Colorado" target="_blank">Palma, palma, palma, não priemos cânico</a>, vamos chegar a ver isso.</p>
<p><br/></p>
<h3>Manipulação de eventos</h3>
<p><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Event</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CaixaEletronico <span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Event</span><span style="color: #339933;">&lt;</span>Movimentacao<span style="color: #339933;">&gt;</span> eventMovimentacao<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> depositar<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        eventMovimentacao.<span style="color: #006633;">fire</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Movimentacao<span style="color: #009900;">&#40;</span>valor<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> sacar<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        eventMovimentacao.<span style="color: #006633;">fire</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Movimentacao<span style="color: #009900;">&#40;</span>-<span style="color: #cc66cc;">1</span> <span style="color: #339933;">*</span> valor<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Movimentacao <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Movimentacao<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">float</span> valor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">valor</span> = valor<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getValor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> valor<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Como podemos ver, a classe <code>CaixaEletronico</code> não tem nenhuma anotação para &#8220;ativá-la&#8221; como injetável, e ainda assim ela é injetada no nosso objeto da classe <code>MovimentacaoControl</code>. Podemos ver também que nossa classe <code>CaixaEletronico</code> não debita diretamente da nossa conta (que nesse exemplo simplista só existe uma). O <code>CaixaEletronico</code> envia uma mensagem que é representada pela classe <code>Movimentacao</code>. Para disparar esse evento nosso <code>CaixaEletronico</code> pede para que seja injetado nele um &#8216;cara&#8217; que sabe disparar eventos do tipo <code>Movimentacao</code>. E então no depósito ele dispara uma movimentação com valor positivo e no saque uma com valor negativo. Bem simples.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.context.ApplicationScoped</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.event.Observes</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Inject</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">br.com.jugms.weldse.intercept.Seguro</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
@ApplicationScoped
@Seguro
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContaBancaria <span style="color: #009900;">&#123;</span>
&nbsp;
    @Inject @Named
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">float</span> saldoInicial = 1000.0f<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> recebeMovimento<span style="color: #009900;">&#40;</span>@Observes Movimentacao movimentacao<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        saldoInicial += movimentacao.<span style="color: #006633;">getValor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getSaldo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> saldoInicial<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Agora na classe <code>ContaBancaria</code> vemos como consumir um evento. Na verdade já tinhamos visto na classe <code>MovimentacaoControl</code>, mas agora vamos de fato utilizar o objeto do evento. Como na <code>MovimentacaoControl</code>, para escutarmos um evento basta termos um método com um parâmetro do tipo do objeto do evento anotado com @Observes. Além disso podemos ver o escopo desse objeto, que é de aplicação. Comente esse escopo e você vai perceber que serão criadas várias contas bancárias, e dessa forma vamos debitar em uma e creditar na outra.</p>
<p>Podemos ver também a injeção de um &#8216;cara&#8217; do tipo float, mas além de @Inject usamos um @Named para isso. O @Named é um qualificador. Nós também podemos, em vários casos vamos &#8220;precisar&#8221;, criar nosso próprios qualificadores. Um qualificador serve para especificar melhor qual candidato à injeção queremos que seja escolhido. Seria como uma cláusula &#8220;where&#8221; na pesquisa por injetáveis. No caso desse float, obviamente algém vai ter que colocá-lo no contexto para que possamos recuperá-lo, e podemos ver isso na classe Produtores.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.jugms.weldse.model</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.enterprise.inject.Produces</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.inject.Named</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* @author http://gilliard.eti.br
*/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Produtores <span style="color: #009900;">&#123;</span>
&nbsp;
    @Produces @Named
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">float</span> getSaldoInicial<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> 2000.0f<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Essa classe agrega todos os métodos produtores da nossa aplicação (que por ser extremamente complexa tem exatamente um <img src='http://blog.gilliard.eti.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Um método produtor (anotado com @Produces) é o oposto do consumidor (@Inject), logo em vez de pegar, ele joga um obejto no contexto, usando como qualificador o @Named que permite darmos um nome ao componente. Só temos que tomar cuidado para não usarmos demais isso e acabarmos tendo tudo ligado via Strings. Nesse exemplo, o nome usado para registrar esse componente é &#8220;saldoInicial&#8221;, pois segue o padrão java bean.</p>
<p>Podemos ver também que que na classe <code>ContaBancaria</code> deixei um saldo inicial de 1000, e depois mandei injetar nessa propriedade o valor de um componente do tipo float chamado &#8220;saldoInicial&#8221; que está com valor 2000. Na prática ficará valendo o 2000, pois o 1000 só vai valer antes que as injeções sejam executadas.</p>
<p>Nos próximos posts eu faço uma sessão específica para comentar as possibilidade de injeção e &#8220;ejeção&#8221; que a CDI provê. E também vou explicar o funcionamento dos interceptadores como podemos ver através da anotação @Seguro da classe <code>ContaBancaria</code>, e também como especificarmos qual implementação de uma interface vamos querer que seja selecionada. Como dá para perceber esse assunto vai longe. Então até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Apresentacao sobre CDI (JSR-299) no Javaneiros2009</title>
		<link>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/</link>
		<comments>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 16:33:13 +0000</pubDate>
		<dc:creator>Gilliard Cordeiro</dc:creator>
				<category><![CDATA[CDI]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[CDI SE]]></category>
		<category><![CDATA[JavaEE 6]]></category>
		<category><![CDATA[JSR-299]]></category>
		<category><![CDATA[JSR-330]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Seam 3]]></category>
		<category><![CDATA[WebBeans]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Weld-SE]]></category>

		<guid isPermaLink="false">http://blog.gilliard.eti.br/?p=179</guid>
		<description><![CDATA[Estou a um bom tempo sem postar, mas nesse tempo fiz bastante coisa que acabei não postando aqui. Uma delas foi uma palestra no Javaneiros2009, falando sobre a JSR-299. Ainda vou postar aqui o exemplo, mas como pretendo explicar cada parte, e isso vai levar mais tempo, já vou postando os slides até para tirar [...]]]></description>
			<content:encoded><![CDATA[<p>Estou a um bom tempo sem postar, mas nesse tempo fiz bastante coisa que acabei não postando aqui. Uma delas foi uma palestra no Javaneiros2009, falando sobre a JSR-299.</p>
<p>Ainda vou postar aqui o exemplo, mas como pretendo explicar cada parte, e isso vai levar mais tempo, já vou postando os slides até para tirar a poeira do blog.</p>
<p><strong>Update:</strong><br />
<a href="http://blog.gilliard.eti.br/2010/03/aplicacao-desktop-com-weld-parte-1/">Desenvolvendo uma aplicação Desktop com Weld – Parte 1</a><br />
<a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-parte-2/">Desenvolvendo uma aplicação Desktop com Weld – Parte 2</a><br />
<a href="http://blog.gilliard.eti.br/2010/05/aplicacao-desktop-com-weld-final/">Desenvolvendo uma aplicação Desktop com Weld – Final</a></p>
<div style="width:425px" id="__ss_3122974"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/gscordeiro/do-seam-ao-cdi-jsr299" title="Do Seam à CDI (JSR-299)">Do Seam à CDI (JSR-299)</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doseamaocdi-100210075749-phpapp02&#038;stripped_title=do-seam-ao-cdi-jsr299" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=doseamaocdi-100210075749-phpapp02&#038;stripped_title=do-seam-ao-cdi-jsr299" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/gscordeiro">gscordeiro</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.gilliard.eti.br/2010/02/apresentacao-sobre-cdi-jsr-299-no-javaneiros2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

