Programação Orientada a Aspectos



Documentos relacionados
JBoss AOP: Tópicos Avançados de Programação Orientada a Aspectos. Kabir Khan Flavia Rainone

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Programação por Objectos. Java

JBoss AOP para quem já conhece AspectJ

INTRODUÇÃO 12. DOCUMENTAÇÃO INTRODUÇÃO INTRODUÇÃO

Desenvolvendo AOP com Spring.NET Aprenda a desenvolver aspectos para encapsular implementações de arquitetura das implementações de negócio

FBV - Linguagem de Programação II. Um pouco sobre Java

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Programação de Computadores - I. Profª Beatriz Profº Israel

Paradigmas de Linguagens de Programação

Invocação de Métodos Remotos

Aspect-Oriented Programming AOP. Comentários Sérgio Crespo

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

2 Desenvolvimento de Software Orientado a Aspectos

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Computação Paralela. Uma framework para aplicações concorrentes João Luís Ferreira Sobral Departamento do Informática Universidade do Minho

POO e suas Limitações Introdução POA AspectJ: Conceitos Básicos Exemplo: Tracing Padrões de Projeto e POA

Computação II Orientação a Objetos

2 Orientação a objetos na prática

Sistemas Distribuídos

SISTEMAS DISTRIBUÍDOS

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Modulo IIa Extra: Object

Programação Orientada a Objetos em java. Polimorfismo

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Documentação Usando o Javadoc

Programação Orientada a Objetos em Java

Técnicas de Programação II

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Orientação a Objetos e a Linguagem Java

Aula 03 - Projeto Java Web

Java 2 Standard Edition Como criar classes e objetos

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Programação Orientada a Aspectos

Guia de Fatores de Qualidade de OO e Java

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Programas eram lineares e com poucos módulos (Programação estruturada) Aumento da complexidade dos sistemas e difícil reusabilidade dos mesmos

Introdução a Java. Hélder Nunes

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

WebWork 2. João Carlos Pinheiro.

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

THREADS EM JAVA. George Gomes Cabral

MIDDLEWARE Aplicativos RMI, RPC e eventos Camadas Protocolo Requesição-Respostal Middleware Representação Externa dos Dados Sistemas Operacionais

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

By Gian Ricardo Berkenbrock & Eduardo Dockhorn da Costa

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

UFG - Instituto de Informática

Orientação a Objetos com Java

Módulo 07 Características Avançadas de Classes

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Reuso com Herança a e Composiçã

Prof. Esp. Adriano Carvalho

AOP - Livro de Receitas

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Análise de Programação

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p:// h7p://leveme.

Criando documentação com javadoc

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

Introdução. Programação. Orientada a Objetos: Reuso. Introdução. Classes Abstratas

Programação Orientada a Objetos (DPADF 0063)

Desenvolvimento Web com Framework Demoiselle versão 1.0

Keeper of Knowledge. Capítulo 2 Classes em Java

Framework utilizando reflexão e aspectos para persistência de objetos em java

Capítulo 4. Packages e interfaces

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Java. Marcio de Carvalho Victorino

Classes, Superclasses e Subclasses

Lógica de Programação

AspectJ. AspectJ. Extensões de AspectJ. Pontos de Junção. Exemplos de Pontos de Junção. Modelo de Pontos de Junção

Java RMI. Alcides Calsavara

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Linguagem de Programação III

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Programação Orientada a Objetos em Java. Herança

Subtipos e Subclasses

Métodos de Construção de Software: Orientação a Objetos. Mestrado em Ciência da Computação 2008 Profa. Itana Gimenes

Prototype, um Design Patterns de Criação

Como construir um compilador utilizando ferramentas Java

Classes Abstratas e Interfaces

POO Programação Orientada a Objetos. Classes em Java

Java TM e o Modelo de Objetos

AspectJ. Silvio do Lago Pereira. Doutorando em Ciência da Computação

Lição 9 Trabalhando com bibliotecas de classes

CURSO DE PROGRAMAÇÃO EM JAVA

Programação com Acesso a BD. Programação com OO Acesso em Java

Transcrição:

Programação Orientada a Aspectos Bibliotecas Dinâmicas Motivação class MyClass { public MyClass() {......... public void method1 () public... void method1 () {...... public int method2() {... public... int method2() {...... public boolean method3() {... public boolean method3() {...... Funcionalidade 1 1

Motivação Funcionalidade 1 Funcionalidade 2 Funcionalidade 3 Funcionalidade 4 Motivação Funcionalidade 1 Funcionalidade 2 Funcionalidade 3 Funcionalidade 4 2

Conceitos Advice Introductions Pointcuts JoinPoints Aspects Funcionalidade Advice X Introduction ADVICE: Class MyClass { void method1() { INTRODUCTION class MyClass implements X { void method1() { void method2() { void methodxxx() { 3

JBOSS AOP JBOSS ASPECT ORIENTED PROGRAMMING FRAMEWORK JBoss AOP Interceptor (advice), Introduction e Pointcuts Manipulação de ByteCodes + HotDeploy Uso de XML para conectar interceptors e introductions a classes java, através de definições de pointcuts. (META-INF/jbossaop.xml) Expressões regulares para especificar pointcuts 4

Interceptor public interface Interceptor { public String getname(); public InvocationResponse invoke(invocation invocation) throws Throwable; InvocationResponse Invocation.invokeNext() InterceptorFactory import org.jboss.aop.advisor; public interface InterceptorFactory { public Interceptor create(advisor advisor); 5

Pointcuts Método <aop> <interceptor name="logging" factory="org.jboss.logginginterceptorfacto ry"/> <method-pointcut class="com.acme.pojo" methodname="get.*"> <interceptors> <interceptor-ref name="logging"/> </interceptors> </method-pointcut> </aop> Pointcuts Atributo <aop> <field-pointcut class="com.acme.pojo" fieldname=".*"> <interceptors> <interceptor-ref name="logging"/> </interceptors> </field-pointcut> </aop> 6

Pointcuts Construtores <aop> <constructor-pointcut class="com.acme.pojo"> <interceptors> <interceptor-ref name="logging"/> </interceptors> </constructor-pointcut> </aop> Pointcuts Classe (Métodos, Construtores e Campos) <aop> <interceptor-pointcut class="com.acme.pojo.*"> <interceptors> <interceptor factory="jboss.security.securityfactory"/> <interceptor-ref name="logging"/> </interceptors> </interceptor-pointcut> </aop> 7

Pointcuts Caller <aop> <caller-pointcut class="com.acme.callingpojo" withinmethodname="callsomemethod" calledclass="com.acme.pojo" calledmethod="somemethod"> <interceptors> <interceptor-ref name="logging"/> </interceptors> </caller-pointcut> </aop> Introduction <aop> <introduction-pointcut class="org.jboss.pojo"> <interfaces> javax.jdo.spi.persistencecapable, org.jboss.jdo.jbossjdo </interfaces> </introduction-pointcut> </aop> POJO pojo = new POJO(); PersistenceCapable jdo = (PersistenceCapable)pojo; JBossJDO jboss_jdo = (JBossJDO)pojo; 8

Introduction <aop> <introduction-pointcut class="org.jboss.pojo"> <mixin> <interfaces> javax.jdo.spi.persistencecapable, org.jboss.jdo.jbossjdo </interfaces> <class>org.jboss.jdo.jdomixin</class> <construction>new org.jboss.jdo.jdomixin(this, "param", 3) </construction> </mixin> </introduction-pointcut> </aop> Meta Dados Uma forma de o interceptador extrair dados sobre uma classe para fazer o seu trabalho. Os meta dados podem ser fornecidos no xml, ou no comentário da classe, através de XDoclet 9

Definindo Meta Dados <aop> <interceptor name="tx" factory="org.jboss.aop.plugins.txintercept orfactory"/> <interceptor-pointcut class="com.acme.pojo.*"> <interceptors> <interceptor-ref name="tx"/> </interceptors> </interceptor-pointcut> Definindo Meta Dados <class-metadata group="transaction" class="com.acme.pojo.*"> <default> <trans-attribute>required</trans-attribute> </default> <method name="somemethod.*"> <trans-attribute>requiresnew</trans-attribute> </method> <field name="stuff"> <trans-attribute>never</trans-attribute> </field> </class-metadata> 10

Obtendo Meta Dados Invocation.getMetaData(String group, String attribute) public class TxInterceptor implements Interceptor { public InvocationResponse invoke(invocation invocation) throws Throwable { String txtype = (String)invocation.getMetaData("transaction", "trans-attribute"); Importando XML <aop> <interceptor name="logging" class="org.jboss.logginginterceptor" singleton="true"> <logging-level>verbose<logging-level> </interceptor> </aop> public interface XmlLoadable { public void importxml(element element) throws Exception; 11

Limitações Uma classe não será instrumentada se não tiver interceptors, poincuts, introductions ou classmatadata definidos antes de ser carregada, e não será possível fazer hot-deploy de quaisquer pointcuts AOP, ou invocar a interface de tempo de execução do JBossAOP de uma classe instrumentada. Caso queira fazer isso: <aop> <advisable class= com.pacote.classe /></aop> Finalizando... É possível definir se métodos serão ou não instrumentados, construtores, e etc. Afinal, a instrumentação (inclusive de atributos) pode causar algum impacto na performance. Alguns métodos e campos são ignorados na definição de pointcuts. 12

Finalizando... É possível utilizar XDoclet para definir todos os elementos AOP do JBoss, como Interceptors, Pointcuts, Introduction, mas o suporte a metadados é provavelmente o mais útil. public interface Advised { public Advisor _getadvisor(); public InstanceAdvisor _getinstanceadvisor(); Finalizando... JBoss AOP pode ser utilizado separadamente do JBoss, mas: É preciso que JBossAOP tenha controle do ClassLoader, portanto é necessário utilizar o SystemClassLoader do JBoss AOP java -Djava.system.class.loader = org.jboss.aop.standalone.systemclassloader POJO No JBoss, extensão.aop (para o jar) 13

AspectWerkz AspectWerkz Advices Introductions Pointcuts Aspects Joinpoints 14

Advices AroundAdvice: é utilizado para interceptar invocações de métodos. PreAdvice: é executado antes do joinpoint. PostAdvice: é executado após o joinpoint. ThrowsAdvice: executado nos pontos em que uma exceção é lançada de um método. Advices public class MyAroundAdvice extends AroundAdvice { public MyAroundAdvice() { super(); public Object execute(final JoinPoint joinpoint) throws Throwable { // do some stuff Object result = joinpoint.proceed(); // do some more stuff return result; 15

Pointcuts MethodPointcut AroundAdvice FieldPointcut PreAdvice PostAdvice ThrowsPointcut ThrowsAdvice Pointcuts CallerSidePointcut PreAdvice PostAdvice CFlowPointcut deve ser utilizado juntamente com os outros pointcuts 16

Introductions Suporte a mixin classes. Muito similar às Introductions do JBossAOP. Caso tenha colisão de nome de métodos em uma ou mais Introductions, o resultado é indeterminado. Aspects Em AspectWerkz, temos a definição de Aspects. O conceito é o mesmo que foi apresentado no início: Unidade de modularidade que representa uma funcionalidade ortogonal à aplicação. Composto por pointcuts, advices e introductions. 17

Exemplos <advice-def name="advices/caching" class="advices.cachingadvice" deploymentmodel="perinstance"> <param name="timeout" value="10"/> </advice> <introduction-def name="java/io/serializable" interface="java.io.serializable"/> <introduction-def name="mixins/mixin" interface="mixins.mixin" implementation="mixins.mixinimpl" deploymentmodel="perthread"/> Exemplos <aspect name="myaspect"> <pointcut-def name="facadecalls" type="cflow" pattern="* *..facade.*.*(..)"/> <pointcut-def name="setters" type="method" pattern="string domain.*.set*(..)"/> <pointcut-def name="getters" type="method" pattern="string domain.*.get*(..)"/> <pointcut-def name="persistentfields" type="setfield" pattern="* domain.*.*" 18

Exemplos <advice cflow="facadecalls" pointcut="setters AND!getters"> <advices-ref name="log_and_cache"/> </advice> <advice pointcut="persistentfields"> <advice-ref name="persistent"/> </advice> <introduction class="domain.*"> <introduction-ref name="serializable"/> <introduction-ref name="mixin"/> </introduction> </aspect> Finalizando... Não utiliza expressões regulares, e sim expressões mais poderosas Ex: org.pojo+, indica POJO e suas subclasses É possível especificar o pacote de um aspecto, fazer heranças de aspectos e até declarar aspectos abstratos no xml. Suporte a Metadados. 19

Finalizando Para reconfigurar e fazer hot deploy dos aspectos, é preciso utilizar código. AspectWerkz.getSystem(uuid).getIntroduction("mi xins/mixin").swapimplementation("mixins.newmixi nimpl"); Extensível: AdviceContainer e IntroductionContainer. Finalizando... Esse se conecta abaixo do class loader bootstrap e pode alterar bytecodes de classes carregadas por todos os class loaders abaixo dele. Algumas forma que o AspectWerkz utiliza para fazer isso: HotSwap (JVM 1.4) Transparent BootClasspath (JVM 1.3) 20

PROSE PROgrammable Service Extensions PROSE Simples Poincuts Advice Aspect Baseado em AspectJ 21

Crosscut Pointcut + Advice Um pointcut é um objeto. Um advice é um método. Um pointcut é associado a um advice através de um crosscut, que também é um objeto. Crosscut Exemplo: public class ExampleCrosscut extends MethodCut { protected PointCutter pointcutter() { return (Executions.before().AND (Within.method("bar.*")) ); public void METHOD_ARGS(Foo x, String arg1,rest y) { System.err.println(" -advice: before "+ x + ".'bar*'("+ arg1 +",..) called"); 22

Crosscut SetCut SET_ARGS((<TargetType> obj, <FieldType> f) GetCut GET_ARGS(<TargetType> obj, <FieldType> f) ThrowCut THROW_ARGS(<ExceptionType> e) Aspect É um objeto, composto por um ou mais Crosscuts. Deve extender: Classe abstrata Aspect: protected abstract Crosscut[] crosscuts(); Classe DefaultAspect. 23

Aspect Exemplo: public class ExampleAspect extends Aspect { ExampleCrosscut mycrosscut = new ExampleCrosscut(); public Crosscut[] crosscuts() { return new Crosscut[] {mycrosscut; Aspect ExampleAspect asp = new ExampleAspect(); ProseSystem.getAspectManager().insert(asp); 24

Finalizando... Não possui around advice. Mas é extensível, você mesmo pode definir novos joinpoints. É possível adicionar e remover aspectos de uma máquina virtual em runtime. Linha de comando. Interface gráfica. Conclusão 25

Conclusão JBossAOP: Complexo. Ferramenta poderosa. Não suporta o conceito de Aspecto como unidade de encapsulamento. Desenvolvida inicialmente voltada para o suporte de Middleware do JBoss. Ainda não está finalizada, inclusive na sua versão standalone. Conclusão AspectWerkz Ferramenta mais madura. Apresenta um conceito incompleto de Aspecto como unidade de encapsulamento. HotDeploy fraco. 26

PROSE Apresenta Aspecto como unidade de encapsulamento completa. Está em um estágio inicial. Não provê suporte a Introductions. Maior legibilidade, porque não utiliza XML (nem programação declarativa), o que também diminui o seu poder. A Importância do Conceito de Aspectos 27

Referências Aspect Oriented Software Development www.aosd.net JBossAOP www.jboss.org/developers/projects/jboss/a op AspectWerkz aspectwerkz.codehaus.org PROSE prose.ethz.ch 28