explicacao neste link aqui.Os interceptadores do CDI permitem que a execucao de um metodo seja executada e isto e muito util em varios cenarios, desde controle de acesso a nivel de metodo ate logar todos os metodos de um bean medindo o tempo de execucao.Vamos precisar de duas classes, para criar o nosso interceptador e utilizar eles no exemplo: RequestCache.java e RequestCacheInterceptor.javaA primeira classe e a definicao na anotacao que vamos utilizar para marcar os metodos que queremos fazer cache: @Inherited@InterceptorBinding@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})public @interface RequestCache {}A segunda classe implementa o interceptador e eu utilizei o proprio request para fazer o cache guardando um Map. A classe abaixo nao esta completa, mas da para entender todo o processo e no final do artigo deixarei um link com o projeto eclipse deste exemplo.@Interceptor@RequestCachepublic class RequestCacheInterceptor implements Serializable { private static final long serialVersionUID = 1L; private static final String MAP_NAME = RequestCacheInterceptor.class.getName() + "_map_cache"; @AroundInvoke public Object execute(InvocationContext invocationContext) throws Exception { Map mapCache = getMapCache(); Key key = new Key(invocationContext); Result result = mapCache.get(key); if (result == null) { long ini = System.currentTimeMillis(); result = new Result(invocationContext.proceed()); result.time = System.currentTimeMillis() - ini; mapCache.put(key, result); } result.count++; return result.object; } @SuppressWarnings("unchecked") private Map getMapCache() { Map map = (Map) getRequest().getAttribute(MAP_NAME); if (map == null) { map = Collections.synchronizedMap(new HashMap()); getRequest().setAttribute(MAP_NAME, map); } return map; }Toda vez que o nosso metodo, marcado com a anotacao @RequestCache, for executado o metodo execute sera chamado e metodo passara a ser executado somente quando for executada o metodo invocationContext.proceed().Apliquei a anotacao, reiniciei o Jboss e executei novamente a pagina: @RequestCache public boolean possuiPermissao(Produto p) { sleep(); boolean resultado = p.getId() % 2 == 0 ? true : false; log.info(MessageFormat.format("possuiPermissao(Produto {0})",p.getId())); return resultado; }21:21:51,339 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 1)21:21:51,361 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 2)21:21:51,385 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 3)21:21:51,407 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 4)21:21:51,432 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 5)21:21:51,454 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 6)21:21:51,480 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 7)21:21:51,502 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 8)21:21:51,526 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 9)21:21:51,548 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 10)21:21:51,573 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 11)21:21:51,596 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 12)21:21:51,619 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 13)21:21:51,641 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 14)21:21:51,665 INFORMACOES [ProdutoMB] (http-...) possuiPermissao(Produto 15)Com isso podemos ver que nosso interceptador funcionou perfeitamente. Podemos usar em varios pontos do projeto e com isto economizamos codigos repetitivos.Neste exemplo utilizei um projeto JSF criado pelo Eclispe e depois Mavenizado pelo Configure / Convert to Maven Project.Utilizei o Jboss 7.1 o download do projeto pode ser feito aqui.Em breve colocarei este exemplo no Github.