/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package service.controleTransacao;
import java.util.HashMap;
import java.util.Map;
import net.sf.cglib.proxy.Enhancer;
public class FabricaDeAppService
{
@SuppressWarnings("unchecked")
private static Map<Class, Object> map = new HashMap<Class, Object>();
@SuppressWarnings("unchecked")
public static <T> T getAppService(Class classeDoService)
throws Exception
{
T appService = (T)map.get(classeDoService);
if(appService == null)
{
// O valor de T ser� designado ap�s a execu��o do m�todo Enhancer.create()
appService = (T)Enhancer.create (classeDoService, new InterceptadorDeAppService());
map.put(classeDoService, appService);
}
return appService;
/*
A classe Enhancer gera subclasses din�micas para habilitar a
intercepta��o de m�todos.
A subclasse gerada dinamicamente faz o override dos m�todos n�o
"finais" da superclasse (ProdutoAppService, por exemplo) e
insere chamadas que executam implementa��es de interceptadores
definidos pelo usu�rio.
O original e mais geral tipo de callback � o MethodInterceptor.
MethodInterceptor � uma interface que possui um m�todo
denominado
intercept(java.lang.Object obj,
java.lang.reflect.Method method,
java.lang.Object[] args,
MethodProxy proxy)
Durante a execu��o do m�todo intercept() acima pode-se
invocar c�digo customizado antes e ap�s a chamada do m�todo
"super". Al�m disso, � poss�vel modificar os valores dos
argumentos antes de chamar o m�todo "super", ou at� mesmo n�o
cham�-lo.
Embora a inteface MethodInterceptor seja gen�rica o suficiente
para fazer o que � necess�rio em qualquer situa��o de
intercepta��o, ela frequentemente � exagerada. Por simplicidade
e desempenho, outros tipos de callback especializados (como o
LazyLoader) tamb�m est�o dispon�veis. Frequentemente um �nico
callback ser� utilizado por classe "enhanced", mas � poss�vel
controlar qual callback est� sendo utilizado (utilizando um
CallbackFilter) a cada execu��o de m�todo.
*/
}
}