230 likes | 347 Views
EJB3 Interceptors. Ricardo Limonta. Agenda. Introdu ção Conceitos de AOP Implementando Interceptors Exemplos Melhores Pr áticas Novidades na vers ão 3.1 Perguntas & Comentários. Palestrante. Ricardo Limonta Arquiteto JEE / Instrutor Java VOffice
E N D
EJB3 Interceptors Ricardo Limonta
Agenda • Introdução • Conceitos de AOP • Implementando Interceptors • Exemplos • Melhores Práticas • Novidades na versão 3.1 • Perguntas & Comentários
Palestrante Ricardo LimontaArquiteto JEE / Instrutor Java VOffice 12 anos na área de sistemas, atuando em projetos nacionais e offshore, médio e grande portes;Certificações: SCJP 5 / SCEA.Hobby Favorito: Surf
Introdução • Recurso introduzido na versão EJB 3.0; • Utiliza o recurso AOP (Aspect-oriented programming). • Permite a criação de métodos que interceptam a chamada a métodos de negócio e eventos de ciclo de vida dos beans; • Podem ser configurados em beans de sessão e beans baseados em mensagens.
Conceitos de AOP Aspect-Orientation Programming:É um paradigma de programação que permite uma separação de código orientada à importância (separation of concerns). Conceito criado por Gregor Kiczales e sua equipe da Xerox. O Intuito principal na utilização de AOP é separar claramente a responsabilidade dos objetos e diminuir massivamente a quantidade de funcionalidades secundárias repetitivas.
Conceitos de AOP Pedido PedidoBean numero: Stringdata: Datevalor: Double pedido: Pedido Insert()update()delete()log()
Conceitos de AOP Pedido PedidoBean numero: Stringdata: Datevalor: Double pedido: Pedido Insert()update()delete() Logger log()
Conceitos de AOP PedidoBean pedido: Pedido Insert()update()delete() Logger log() Combinação
Conceitos de AOP Cenário: • Um componente deve ser capaz de incluir pedidos; • Deve existir uma aprovação sobre o valor do pedido em relação ao perfil do usuário logado no sistema; • Deve existir um log de transação, as informações de usuário, ação executada e tempo de execução devem ser gravados;
Conceitos de AOP public Pedido insert(Pedido pedido) throws BusinessException { long startTime = System.currentTimeMillis(); try{ //verifica se o usuário tem perfil para aprovação de pedidos. if ((pedido.getValor() > 10000.0d) && (! principal.getName().equals("supervisor"))){ throw new BusinessException("O usuário não tem permissão ..."); } //implementa as regras de negócio…save(pedido); } catch (Exception e) { throw new BusinessException(e); } finally { long endTime = System.currentTimeMillis() - startTime; System.out.println("insert() - " + endTime + " - " + principal.getName()); } return pedido; }
Conceitos de AOP @Interceptors(LogInterceptor.class) public Pedido insert(Pedido pedido) throws BusinessException { //verifica se o usuário tem perfil para aprovação de pedidos. if ((pedido.getValor() > 10000.0d) && (! principal.getName().equals("supervisor"))){ throw new BusinessException("O usuário não tem permissão ..."); } //implementa as regras de negócio…save(pedido); return pedido; }
Conceitos de AOP @Interceptors(values={LogInterceptor.class, PedidoAlcadaInterceptor.class}) public Pedido insert(Pedido pedido) throws BusinessException { //implementa as regras de negócio…save(pedido); return pedido; }
Interceptors • São objetos capazes de interceptar chamadas a métodos de negócio ou eventos de ciclo de vida dos beans; • “Rodam” na mesma pilha de processamento do bean, no mesmo contexto de transação e segurança, do método requisitado. • Acesso a todos recursos do container JEE (@…); • Funcionam como uma extensão do EJB.
Interceptors Interceptador para de métodos de negócio… @AroundInvoke public Object <Name>(InvocationContext invocation) throws Exception { … }
Interceptors Exemplo: LogInterceptor.java public class LogInterceptor { @AroundInvoke public Object logger(InvocationContext invocation) throws Exception { long startTime = System.currentTimeMillis(); try { return invocation.proceed(); } finally { long endTime = System.currentTimeMillis() - startTime; System.out.println("Method: " + invocation.getMethod().getName() + " - " + "Values: " + invocation.getParameters()[0] + " - " + "Time: " + endTime + " - " + "User: " + ctx.getCallerPrincipal().getName()); } } }
Interceptors Interceptando eventos dos beans… @<Callback-Annotation> public void<Name>(InvocationContext invocation) { … } Exemplo: @PostConstructpublic void<Name>(InvocationContext invocation) { … }
Interceptors InvocationContext:Contém as informações do objeto interceptado. Principais métodos:
Interceptors PedidoBean Insert(pedido) Client Chamada a um bean sem interceptor…
Interceptors Combinação PedidoBean Client Insert(pedido) Interceptor A Interceptor B Interceptor C Chamada a um bean com interceptors…
Exemplos Show Demo…
Melhores Práticas - Procure sempre identificar necessidades genéricas que se faça necessário o uso de interceptors. Logs, Handlers, Validadores, etc. - Crie interceptors com baixa complexidade; - Documentação é tudo !
Novidades Definir sua própria anotação de interceptors… @Interceptors(LogInterceptor.class) public @InterfaceAuditoria{} Forma de uso: @Auditoria public voiddelete(Long idPedido) { … }