Criei um service locator com funcionalidades de lazy-load. Ou seja, quando você faz um get em um EJB o mesmo traz apenas um proxy, e somente quando você chamar um método dele que realmente será feito o lookup. Porém fazendo um debug ele está fazendo o lookup do EJB duas vezes: uma quando retorno o proxy e outra quando eu realmente uso o EJB.
O certo ele deveria fazer lookup apenas quando eu usar o EJB, e não nesses dois momnetos citados acima. Alguém que já usou cglib sabe como resolver?
[code]public final class ServiceLocator {
public static <T> T getEJB(Class<T> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(new Class[] { clazz });
enhancer.setCallback(new Interceptor(clazz));
return (T) enhancer.create();
}
private static class Interceptor
implements MethodInterceptor {
final Class<?> clazz;
public Interceptor(Class<?> clazz) {
this.clazz = clazz;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
try {
return method.invoke(doGetEJB(clazz), args);
} catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}
private Object doGetEJB(Class<?> clazz) {
try {
logger.debug("trying lookup");
Object instance = ctx.lookup(clazz.getName());
logger.debug("lookup ok, {}", instance);
return instance;
} catch (NamingException e) {
throw new InfraestructureException(e);
}
}
}
}[/code]