<?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>Programando Java</title>
	<atom:link href="http://blog.tomazlavieri.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tomazlavieri.com.br</link>
	<description>Facilitando a programação</description>
	<lastBuildDate>Sat, 07 Nov 2009 06:42:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VRaptor 3 &#8211; Poupando recursos &#8211; LAZY Dependence Injection</title>
		<link>http://blog.tomazlavieri.com.br/2009/vraptor-3-poupando-recursos-lazy-dependence-injection/</link>
		<comments>http://blog.tomazlavieri.com.br/2009/vraptor-3-poupando-recursos-lazy-dependence-injection/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 13:15:37 +0000</pubDate>
		<dc:creator>Tomaz Lavieri</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[VRaptor]]></category>
		<category><![CDATA[VRaptor3]]></category>
		<category><![CDATA[DI]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[LAZY]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Session]]></category>

		<guid isPermaLink="false">http://blog.tomazlavieri.com.br/?p=6</guid>
		<description><![CDATA[Objetivo: Ao final deste artigo espera-se que você saiba como poupar recursos caros, trazendo eles de forma LAZY, ou como prefiro chamar Just-in-Time (no momento certo).
No VRaptor3 a injeção de dependencia ficou bem mais fácil, os interceptadores que eram os responsáveis para injetar a dependencia sumiram e agora fica tudo a cargo do container, que [...]]]></description>
			<content:encoded><![CDATA[<p>Objetivo: Ao final deste artigo espera-se que você saiba como poupar recursos caros, trazendo eles de forma LAZY, ou como prefiro chamar Just-in-Time (no momento certo).</p>
<p>No VRaptor3 a injeção de dependencia ficou bem mais fácil, os interceptadores que eram os responsáveis para injetar a dependencia sumiram e agora fica tudo a cargo do container, que pode ser o Spring ou o Pico.</p>
<p>A facilidade na injeção de dependencia tem um custo, como não é mais controlado pelo programador que cria o interceptor sempre que declaramos uma dependencia no construtor de um @Component, @Resource ou @Intercepts ele é injetado no inicio, logo na construção, porem as vezes o fluxo de um requisição faz com que não usemos algumas destas injeções de dependencia, disperdiçando recursos valiosos.</p>
<p>Por exemplo, vamos supor o seguinte @Resource abaixo, que cadastra produtos</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">import java.util.List;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.hibernate.Session;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.Result;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.view.Results;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> ProdutoController <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* O recurso que queremos poupar.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> Session session;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> Result result;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> ProdutoController<span class="br0">(</span><span class="kw2">final</span> Session session, <span class="kw2">final</span> Result result<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">session</span> = session;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">result</span> = result;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/** </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* apenas renderiza o formulário</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> form<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> List&lt;Produto&gt; listar<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> session.<span class="me1">createCriteria</span><span class="br0">(</span>Produto.<span class="kw2">class</span><span class="br0">)</span>.<span class="me1">list</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Produto adiciona<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; session.<span class="me1">persist</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.<span class="me1">use</span><span class="br0">(</span>Results.<span class="me1">logic</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>.<span class="me1">redirectTo</span><span class="br0">(</span>getClass<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>.<span class="me1">listar</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> produto;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Sempre que alguem faz uma requisição a qualquer lógica dentro do recurso ProdutoController uma Session é aberta, porem note que abrir o formulário para adicionar produtos não requer sessão com o banco, ele apenas renderiza uma página, cada vez que o formulário de produtos é aberto um importante e caro recurso do sistema esta sendo requerido, e de forma totalmente ociosa.</p>
<p>Como agir neste caso ? isolar o formulário poderia resolver este problema mais recairia em outro, da mantenabilidade.</p>
<p>O ideal é que este recurso só fosse realmente injetado no tempo certo (Just in Time) como seria possivel fazer isso ? a solução é usar proxy dinamicos, enviando uma session que só realmente abrirá a conexão com o banco quando um de seus métodos for invocado</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">import java.lang.reflect.Method;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import javax.annotation.PreDestroy;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import org.hibernate.classic.Session;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.hibernate.SessionFactory;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import net.vidageek.mirror.dsl.Mirror;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.ioc.ApplicationScoped;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.ioc.Component;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.ioc.ComponentFactory;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.ioc.RequestScoped;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.proxy.MethodInvocation;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.proxy.Proxifier;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.proxy.SuperMethod;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* &lt;b&gt;JIT (Just-in-Time) {@link Session} Creator&lt;/b&gt; fábrica para o componente {@link Session}</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* gerado de forma LAZY ou JIT(Just-in-Time) a partir de uma {@link SessionFactory}, que</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* normalmente se encontra em um ecopo de aplicativo @{@link ApplicationScoped}.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* </span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* @author Tomaz Lavieri</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @since 1.0</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">@<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AComponent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Component</span></a></div>
</li>
<li class="li2">
<div class="de2">@RequestScoped</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> JITSessionCreator <span class="kw2">implements</span> ComponentFactory&lt;Session&gt; <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">static</span> <span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Method</span></a> CLOSE = <span class="kw2">new</span> Mirror<span class="br0">(</span><span class="br0">)</span>.<span class="me1">on</span><span class="br0">(</span>Session.<span class="kw2">class</span><span class="br0">)</span>.<span class="me1">reflect</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">method</span><span class="br0">(</span><span class="st0">&#8220;close&#8221;</span><span class="br0">)</span>.<span class="me1">withoutArgs</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">static</span> <span class="kw2">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Method</span></a> FINALIZE = <span class="kw2">new</span> Mirror<span class="br0">(</span><span class="br0">)</span>.<span class="me1">on</span><span class="br0">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a>.<span class="kw2">class</span><span class="br0">)</span>.<span class="me1">reflect</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">method</span><span class="br0">(</span><span class="st0">&#8220;finalize&#8221;</span><span class="br0">)</span>.<span class="me1">withoutArgs</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> SessionFactory factory;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="coMULTI">/** Guarda a Proxy Session */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> Session proxy;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/** Guarada a Session real. */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> Session session;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> JITSessionCreator<span class="br0">(</span><span class="kw2">final</span> SessionFactory factory, <span class="kw2">final</span> Proxifier proxifier<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">factory</span> = factory;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">proxy</span> = proxify<span class="br0">(</span>Session.<span class="kw2">class</span>, proxifier<span class="br0">)</span>; <span class="co1">// *1*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Cria o JIT Session, que repassa a invocação de qualquer método, exceto </span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* {@link Object#finalize()} e {@link Session#close()}, para uma session real, criando </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* uma se necessário.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> Session proxify<span class="br0">(</span>Class&lt;? <span class="kw2">extends</span> Session&gt; target, Proxifier proxifier<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> proxifier.<span class="me1">proxify</span><span class="br0">(</span>target, <span class="kw2">new</span> MethodInvocation&lt;Session&gt;<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override <span class="co1">// *2*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> intercept<span class="br0">(</span>Session proxy, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMethod+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Method</span></a> method, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a><span class="br0">[</span><span class="br0">]</span> args, SuperMethod superMethod<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>method.<span class="me1">equals</span><span class="br0">(</span>CLOSE<span class="br0">)</span> || <span class="br0">(</span>method.<span class="me1">equals</span><span class="br0">(</span>FINALIZE<span class="br0">)</span> &amp;&amp; session == <span class="kw2">null</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">null</span>; <span class="co1">//skip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">new</span> Mirror<span class="br0">(</span><span class="br0">)</span>.<span class="me1">on</span><span class="br0">(</span>getSession<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>.<span class="me1">invoke</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">method</span><span class="br0">(</span>method<span class="br0">)</span>.<span class="me1">withArgs</span><span class="br0">(</span>args<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Session getSession<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>session == <span class="kw2">null</span><span class="br0">)</span> <span class="co1">// *3*</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; session =&nbsp; &nbsp; &nbsp; &nbsp;factory.<span class="me1">openSession</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> session;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; @Override</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Session getInstance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> proxy; <span class="co1">// *4*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; @PreDestroy</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> destroy<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// *5*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>session != <span class="kw2">null</span> &amp;&amp; session.<span class="me1">isOpen</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; session.<span class="me1">close</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Explicando alguns pontos chaves, comentados com // *N*</p>
<ol>
<li>O Proxfier é um objeto das libs do vrapor que auxilia na criação de objetos proxys ele é responsável por escolher a biblioteca que implementa o proxy dinamico, e então invocar via callback um método interceptor, como falamo abaixo.</li>
<li>Neste ponto temos a implementação do nosso interceptor, sempre que um método for envocado em nosso proxy, esse intereptor é invocado primeiro, ele filtra as chamada ao método finalize caso a session real ainda não tenha sido criada, isso evita criar a session apenas para finaliza-la.<br />
O método close também é filtrao, isso é feito para evitar criar uma session apenas para fecha-la, e também por que o nosso SessionCreator é que é o responsavel por fechar a session ao final do scopo, quando a request acabar.<br />
Todos os outros métodos são repassados para uma session através do método getSession() onde é realmente que acontece o LAZY ou JIT.</li>
<li>Aqui é onde acontece a mágia, da primeira vez que getSession() é invocado a sessão é criada, e então repassada, todas as outras chamadas a getSession() repassam a sessão anteriormente criada, assim, se getSession() nunca for envocado, ou seja, se nenhum método for envocado no proxy, getSession() nunca será invocado, e a sessão real não será criada.</li>
<li>O retorno desse ComponentFactory é a Session proxy, que só criará a session real se um de seus métodos for invocado.</li>
<li>Ao final do escopo o destroy é invocado, ele verifica se a session real existe, existindo verifica se esta ainda esta aberta, e estando ele fecha, desta forma é possivel garantir que o recurso será sempre liberado.</li>
</ol>
<p>Assim podemos agora pedir uma session sempre que acharmos que vamos precisar de uma, sabendo que o recurso só será realmente solicitado quando formos usar um de seus métodos, salvando assim o recurso.</p>
<p>Esta mesma abordagem pode ser usada para outros recursos caros do sistema.</p>
<p>Os códigos fonte para os ComponentFactory de EntityManager e Session que utilizo podem ser encontrados neste link: <a href="http://guj.com.br/posts/list/141500.java">http://guj.com.br/posts/list/141500.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomazlavieri.com.br/2009/vraptor-3-poupando-recursos-lazy-dependence-injection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VRaptor3 &#8211; Interceptando recursos anotados</title>
		<link>http://blog.tomazlavieri.com.br/2009/vraptor3-interceptando-recursos-anotados/</link>
		<comments>http://blog.tomazlavieri.com.br/2009/vraptor3-interceptando-recursos-anotados/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 14:21:48 +0000</pubDate>
		<dc:creator>Tomaz Lavieri</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[VRaptor]]></category>
		<category><![CDATA[VRaptor3]]></category>
		<category><![CDATA[Interceptor]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Transação]]></category>
		<category><![CDATA[Transaction]]></category>

		<guid isPermaLink="false">http://blog.tomazlavieri.com.br/?p=14</guid>
		<description><![CDATA[Em primeira lugar, gostaria de tecer meus mais sinceros elogios a equipe VRaptor, a versão 3 esta muito boa, bem mais intuitiva e fácil de usar que a 2.6
Neste artigo vou mostar como interceptar um método de um Resource especifico, identificando-o a partir de uma anotação e executar ações antes do método executar, e após [...]]]></description>
			<content:encoded><![CDATA[<p>Em primeira lugar, gostaria de tecer meus mais sinceros elogios a equipe VRaptor, a versão 3 esta muito boa, bem mais intuitiva e fácil de usar que a 2.6</p>
<p>Neste artigo vou mostar como interceptar um método de um Resource especifico, identificando-o a partir de uma anotação e executar ações antes do método executar, e após ele executar.</p>
<p>Vamos supor que nós temos o seguinte Resource para adicionar produtos no nosso sistema</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1">@Resource</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> ProdutoController <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> DaoFactory factory;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> ProdutoDao dao;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> ProdutoController<span class="br0">(</span>DaoFactory factory<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">factory</span> = factory;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">dao</span> = factory.<span class="me1">getProdutoDao</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> List&lt;Produto&gt; listar<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">list</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Produto atualizar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">beginTransaction</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; produto = dao.<span class="me1">update</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> produto;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span> <span class="kw2">catch</span> <span class="br0">(</span>DaoException ex<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">rollback</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">throw</span> ex;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Produto adicionar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">beginTransaction</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; produto = dao.<span class="me1">store</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> produto;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span> <span class="kw2">catch</span> <span class="br0">(</span>DaoException ex<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factory.<span class="me1">rollback</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">throw</span> ex;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Agora nos queremos que um interceptador intercepte meu recurso, e execute a lógica dentro de um escopo transacional, como fazer isso ? é só criar um interceptador assim.</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">import org.hibernate.Session;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import org.hibernate.Transaction;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.Intercepts;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.core.InterceptorStack;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import br.com.caelum.vraptor.interceptor.Interceptor;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import br.com.caelum.vraptor.resource.ResourceMethod;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">@Intercepts</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> TransactionInterceptor <span class="kw2">implements</span> Interceptor <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> Session session;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> TransactionInterceptor<span class="br0">(</span>Session session<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">session</span> = session;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> intercept<span class="br0">(</span>InterceptorStack stack, ResourceMethod method, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AObject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> instance<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Transaction transaction = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; transaction = session.<span class="me1">beginTransaction</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stack.<span class="me1">next</span><span class="br0">(</span>method, instance<span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; transaction.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span> <span class="kw2">finally</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>transaction != <span class="kw2">null</span> &#038;&#038; transaction.<span class="me1">isActive</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; transaction.<span class="me1">rollback</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> accepts<span class="br0">(</span>ResourceMethod method<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">true</span>; <span class="co1">//aceita todas as requisições</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Ok, o interceptador vai rodar e abrir transação antes e depois de executar a logica, e os métodos transacionais da minha lógica irão se reduzir a isto</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Produto atualizar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">update</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Produto adicionar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">store</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Ok mas, neste caso temos o problema de que métodos que não exigem transação estão abrindo e fechando transação a cada requisição sem necessidade.</p>
<p>Como então selecionar apenas algumas lógicas para serem transacionais ? podem criar uma anotação para isto, desta forma:</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">import java.lang.annotation.ElementType;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import java.lang.annotation.Retention;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.lang.annotation.RetentionPolicy;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import java.lang.annotation.Target;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Usado para garantir que um determinado recurso interceptado seja executada em um</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* escopo de tranzação.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @author Tomaz Lavieri</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* @since 1.0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li2">
<div class="de2">@Retention<span class="br0">(</span>RetentionPolicy.<span class="me1">RUNTIME</span><span class="br0">)</span></div>
</li>
<li class="li1">
<div class="de1">@Target<span class="br0">(</span><span class="br0">{</span>ElementType.<span class="me1">METHOD</span>,ElementType.<span class="me1">TYPE</span><span class="br0">}</span><span class="br0">)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> @<span class="kw2">interface</span> Transactional <span class="br0">{</span><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Agora precisamos marcar os pontos onde queremos que o escopo seja transacional com esta anotação.</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1">@Resource</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> ProdutoController <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">final</span> ProdutoDao dao;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> ProdutoController<span class="br0">(</span>ProdutoDao dao<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">dao</span> = dao;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> List&lt;Produto&gt; listar<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">list</span><span class="br0">(</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; @Transactional</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Produto atualizar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">update</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; @Transactional</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> Produto adicionar<span class="br0">(</span>Produto produto<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> dao.<span class="me1">store</span><span class="br0">(</span>produto<span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Ok o código ficou bem mais enxuto, mas como interceptar apenas os métodos marcados com esta anotação ?? para tal basta no nosso accepts do TransactionInterceptor verificarmos se a anotação esta presente no método, ou no proprio rescurso (quando marcado no recurso todos os métodos do recurso seriam transacionais).</p>
<p>A modificação do método ficaria assim</p>
<div class="syntax">
<div class="java" style="font-family: monospace;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> accepts<span class="br0">(</span>ResourceMethod method<span class="br0">)</span> <span class="br0">{</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span>&nbsp; method </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">getMethod</span><span class="br0">(</span><span class="br0">)</span> <span class="co1">//metodo anotado</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">isAnnotationPresent</span><span class="br0">(</span>Transactional.<span class="kw2">class</span><span class="br0">)</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || method</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">getResource</span><span class="br0">(</span><span class="br0">)</span> <span class="co1">//ou recurso anotado</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">getType</span><span class="br0">(</span><span class="br0">)</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">isAnnotationPresent</span><span class="br0">(</span>Transactional.<span class="kw2">class</span><span class="br0">)</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
</li>
</ol>
</div>
</div>
<p>Pronto agora somente os métodos com a anotação @Transacional são executados em escopo de transação e economisamos linhas e linhas de códigos de try{commit}catch{rollback throw ex}</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomazlavieri.com.br/2009/vraptor3-interceptando-recursos-anotados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Collection e Generics</title>
		<link>http://blog.tomazlavieri.com.br/2009/collection-e-generics/</link>
		<comments>http://blog.tomazlavieri.com.br/2009/collection-e-generics/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 06:34:44 +0000</pubDate>
		<dc:creator>Tomaz Lavieri</dc:creator>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tipologia]]></category>

		<guid isPermaLink="false">http://blog.tomazlavieri.com.br/?p=24</guid>
		<description><![CDATA[Ultima apresentação que fiz para o Grupo de SCJP referencte a Collections e Generics
Em breve posto mais detalhes.
para baixar a apresentação sem se cadastrar no SlideShare slides em pdf

Collections E Generics
Veja mais documentos de Tomaz Lavieri.


]]></description>
			<content:encoded><![CDATA[<p>Ultima apresentação que fiz para o Grupo de SCJP referencte a Collections e Generics</p>
<div>Em breve posto mais detalhes.</div>
<div>para baixar a apresentação sem se cadastrar no SlideShare <a href="http://sites.google.com/site/tomazlavieri/files/Collections_e_Generics.pdf?attredirects=0">slides em pdf</a></div>
<div>
<div id="__ss_1732924" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Collections E Generics" href="http://www.slideshare.net/lavieri/collections-e-generics">Collections E Generics</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="723" height="604" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=collectionsegenerics-090716213639-phpapp02&amp;stripped_title=collections-e-generics" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="600" height="500" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=collectionsegenerics-090716213639-phpapp02&amp;stripped_title=collections-e-generics" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">Veja mais <a style="text-decoration:underline;" href="http://www.slideshare.net/">documentos</a> de <a style="text-decoration:underline;" href="http://www.slideshare.net/lavieri">Tomaz Lavieri</a>.</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomazlavieri.com.br/2009/collection-e-generics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
