Aspect-Oriented Programming

Ola povo,
bem tava dando um olhada na Mundo Java desse mês, q ta show, e li sobre
AOP, e fiquei muito interessado em aprender mais sobre o assunto. Alguém
pode me indicar um livro ou um link com referências mais detalhadas.
Perguntei sobre a iteração com Java à um amigo e ele me aconselhou fugir
do AspectJ, ainda não sei o motivo, ele me disse pra dar uma olhada no
Aspectwerkz, que segundo ele é mto bom, alguém pode dizer a diferença?

Obrigado.

Fala pro seu amigo expor as idéias dele…
AspectJ hj é uma das principais implementações da AOP para java…
Entretanto, jah ouvi umas coisas sobre AspectWerkZ q ele deixa lento, eh cheio de bugs, nao tem doc decente . etc… Nao sei se eh verdade, mas q o AspectJ é razoavelmente estável e que têm uma grande documentação (dois livros muito bons, o do Ramnivas eh ótimo)…

Abraços

aspectj te forca a aprender uma sintaxe de programacao nova, e o codigo fica todo no teu .java… entao, todo lugar onde forem usar o teu source, vao ter que ter plugins do aspectj, para a IDE nao encher o saco…

AW eh bastante completo, e tem varias formas de fazer os teus aops…
dynaop e nanning usam o conceito de proxy, e sao muito simples de trabalhar.

Rafael

Qual sintaxe kra
Ce tah falando do aspect, pointcut e os advices??? Po pra falar os joinpoints vc precisa conhecer um pouquinho de expressoes regulares! Acho q em 15 min uma pessoa que conheca java aprende??? codigo no .java??? Quando??? Onde???
Nao intendi nada do teu post…

Abraços

Indicam alguma leitura sobre o assunto?

Se for artigo na web:

[list]


http://www.parc.com/research/csl/projects/aspectj/default.html
[/list]

Livros

[list]



[/list]

É basicamente a bibliografia do meu trabalho de conclusao de curso…
Sobre AspectJ

Abraços

[quote=“duardor”]Qual sintaxe kra
Ce tah falando do aspect, pointcut e os advices??? Po pra falar os joinpoints vc precisa conhecer um pouquinho de expressoes regulares! Acho q em 15 min uma pessoa que conheca java aprende??? codigo no .java??? Quando??? Onde???
Nao intendi nada do teu post…

Abraços[/quote]

Isso:

public aspect MannersAspect {
    pointcut callSayMessage() : call(public static void HelloWorld.say*(..));
    before() : callSayMessage() {
        System.out.println("Good day!");
    }

    after() : callSayMessage() {
        System.out.println("Thank you!");
    }
}

se isso nao eh sintaxe nova, o que eh entao?

Rafael

Isso é uma das coisas mais malas mesmo do AspectJ. Além da linguagem e compiladores próprios, ele não permite umas coisinhas maravilhosas que o AspectWerkz permite, como reestruturação de advices em runtime (aliás, dá para fazer quase tudo em runtime). O mais legal ainda sobre o AspectWerkz é que você não precisa aprender um “dialeto” para usar AOP, já que você escreve os aspectos, advices e mixins usando Java :wink:
Mas, ultimamente ando eu lua-de-mel com o Dynaop ( http://dynaop.dev.java.net ), que, como o Steil falou, faz as mesmas maluquices com dynamic proxies que o AW, mas tem uma modelo de configuração super “cuti-cuti” usando BeanShell.

[quote=“Rafael Steil”][quote=“duardor”]Qual sintaxe kra
Ce tah falando do aspect, pointcut e os advices??? Po pra falar os joinpoints vc precisa conhecer um pouquinho de expressoes regulares! Acho q em 15 min uma pessoa que conheca java aprende??? codigo no .java??? Quando??? Onde???
Nao intendi nada do teu post…

Abraços[/quote]

Isso:

public aspect MannersAspect {
    pointcut callSayMessage() : call(public static void HelloWorld.say*(..));
    before() : callSayMessage() {
        System.out.println("Good day!");
    }

    after() : callSayMessage() {
        System.out.println("Thank you!");
    }
}

se isso nao eh sintaxe nova, o que eh entao?

Rafael[/quote]
Oko ok , eh novo, mas de maneira nenhuma eh dificil… Acho q qq um com um minimo de experiencia em programacao pega em 15 min, pelo menos os conceitos…

Pergunta: como funciona estas outras implementações de AOP… Como vc define os join points?? eh em um xml???
Nao tem compilador próprio tb??? Vc tem q extender/ implementar algo opara utilizar os aspectos???
Enfim quais são as desvatnagens ???

Abraços

Uma rapidinha no Dynaop:

Uma introdução é definida assim:

public interface HasSomeField {
	
	void setSomeField(int a);
	int getSomeField();

}

public class HasSomeFieldImpl implements HasSomeField, Serializable {
	
	private int a;

	/* (non-Javadoc)
	 * @see foo.HasSomeField#setSomeField(int)
	 */
	public void setSomeField(int a) {
		this.a = a;
	}

	/* (non-Javadoc)
	 * @see foo.HasSomeField#getSomeField()
	 */
	public int getSomeField() {
		return a;
	}
}

Agora, vamos supor que você queira fazer um mixin da classe acima com uma outra que eu vou definir aqui embaixo:

public interface MyEntity { }

public class MyEntityImpl implements MyEntity, java.io.Serializable { }

Para dizer que o seu MyEntity pode sofrer um mixin com HasSomeFieldImpl, você cria um arquivo chamado “dynaop.bsh” e adiciona a seguinte configuração:

mixin(
  foo.MyEntity.class, 
  foo.HasSomeFieldImpl.class
);

E seu cliente vai brincar com suas classes assim:

//...
MyEntity myClass = new MyEntityImpl();
myClass = (MyEntity) ProxyFactory.getInstance().wrap(myClass);
((HasSomeField)myClass).setSomeField(0);
//...

Fácil, não?

Cara, vc ta julgando as outras implementacoes sem ao menos ter mexido 10 minutos com elas.

aspectj nao se aprende o necessario para desenvolver direito em 15 minutos. Ha muitas keywords novas, e a forma de trabalho eh bastante diferente.

Usando dynaop, vc configura os interceptors e mixins utilizando beanshell, aspect werks eh xml e nanning tmb.

O que voce precisa fazer para usar dynaop? simplesmente implemente Interceptor, faca la a logica que voce precisa, e de um proceed() para invocar o metodo.

O outro passo eh chamar um factory para criar o proxy, e soh. Programacao Java nao-intrusiva e intuitiva, como o usual :wink:

Nao estou dizendo que aj totalmente sucks, mas nao vejo vantagem alguma em utilizar ele em relacao aos outros frameworks disponiveis.

Rafael

gosto também do AOP fornecido pelo Spring,
como este é totalmente integrado com o framework IoC do Spring,
você configura um bean qualquer, e adiciona nele interceptors e pronto :slight_smile:

ou então pode-se também adicionar o interceptor em diversos beans ao mesmo tempo, por exemplo, uma parte da config do JNuke:

<bean id="loggingBeanNameProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>*</value> </property> <property name="interceptorNames"> <list> <value>logInterceptor</value> </list> </property> </bean>

adiciona logging (logInterceptor é um bean/interceptor definido no applicationContext do spring, que loga todas as chamadas ou exceções ocorridas em qualquer metodo).

mas a maior vantagem é a integração com todo o resto do spring :slight_smile:

Putz, por esse tópico, já vi vou ter que aprender Java (ou seja lá o que for) de novo! :?

[quote=“Rafael Steil”]Cara, vc ta julgando as outras implementacoes sem ao menos ter mexido 10 minutos com elas.

aspectj nao se aprende o necessario para desenvolver direito em 15 minutos. Ha muitas keywords novas, e a forma de trabalho eh bastante diferente.

Usando dynaop, vc configura os interceptors e mixins utilizando beanshell, aspect werks eh xml e nanning tmb.

O que voce precisa fazer para usar dynaop? simplesmente implemente Interceptor, faca la a logica que voce precisa, e de um proceed() para invocar o metodo.

O outro passo eh chamar um factory para criar o proxy, e soh. Programacao Java nao-intrusiva e intuitiva, como o usual :wink:

Nao estou dizendo que aj totalmente sucks, mas nao vejo vantagem alguma em utilizar ele em relacao aos outros frameworks disponiveis.

Rafael[/quote]

Ae!
Perae, nao to julgando as outras mesmo pq nao conheco!
Deve ter coisa melhor sim e bem mais avançada (tipo eu jah estudei um Server App chamado JAC q tem um lance de distribuicao de aspectos, bem legalzim a ideia, surgiu da tese achoq de mestrado de um tal de Renauld Pawlak)…
Mas q eu falo q AspectJ é relativamente fácil e bem documentado, isso eu falo mesmo!
:slight_smile:
Mas depois de acabar minha graduação vou tentar fazer algo em uma pós relacionada a aspectos e dai ver os outros!
:slight_smile:

PS: Valeu pelo exemplo Daniel!

Abraços

Tipo Rafael e Daniel, qual implementacao AOP tem uma curva de aprendizado mais suave, nas suas opinioes???

Abraços

Eu gostei muito do Dynaop (como disse, lua-de-mel). Aprender a usá-lo foi muito fácil, a documentação não é extensa, mas é concisa e cobre os tópicos “feijão-com-arroz-bife-e-batata-frita” do uso de AOP.
Mas eu também gosto bastante do AW, embora eu o ache “expert-only” demais.

Well well well … vou entrar de bicao.

Eu estudei o AspectJ e o AspectWerkz e achei o AspectWertkz bem mais fácil de trabalhar.

Ele se integra bem com qualquer ambiente, inté numa IDE sem plugin nenhum :shock:

Fazer o weaver em execução já é um ponto positivo pq permite uma flexibilidade muito boa … o compilador tb eh batuta e bem facil.

Quanto aos joinpoints, pointcuts & cia … baba! Tudo no XML com uma linguagem tipo ER bem completa, mas pra quem se complicar demais pode fazer via programacao mesmo … nao esquece que pode gerar o XML com Xdoclet.

Só pra acrescentar mais um pedido…:smiley:
estou começando a querer entender agora AOP, quero aprofundar meus
conhecimentos. Gostaria de saber onde encontro uma explicação fácil,
didática sobre os conceittos da AOP, como pointcuts, joinpoints, advice,
weaving
, etc…ainda to meio boiando nesses conceitos.:oops:

Agradeceria se alguém desse uma dica.

Obrigado.

Na pagina do aspectwerkz ( aspectwerkz.codehaus.org ) e o manual do dynaop ( dynaop.dev.java.net ) tem um material mto bom.

Rafael

Boa Tarde

Estava buscando informações sobre AOP pelo forum, encontrei o post nesse tópico do Mestre Urubatan mensionando o Spring.
Fiz algumas consutas e cheguei próximo ao objetivo.

Então fui testar o spring.

Fiz minha aplicação, 1, usando spring 2.5, hibernate, jpa, jsf e facelets, bunitinho MVC.

Fiz uma outra aplicação, 2, que depende de informações da aplicação 1. A aplicação 2 é orientada a agentes e fazendo toda análise de um determinado domínio. O aspecto no 1 faz com que a 2 perceba alterações na 1 e busque saber se trata da sua responsabilidade.

Bom ai configurei o spring da segunte forma:

No xml de fonfig do Spring: applicationContext.xml (no meu caso)

<!-- Interceptadores do aspecto -->
    <bean id="interceptorBeansBefor" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">

            <value>cidadeDAO</value> <!-- Nome da entidade que pretende que seja interceptada caso queira todos coloque * -->

        </property>
        <property name="interceptorNames">
            <list>
                <!--value>aspectBeforMetodo</value -->
                 <value>aspectAfterMetodo</value> <!-- No meu caso so precisava que fosse interceptado as alterações ao finalisar o metodo dos dois acrescente as duas classes. -->
            </list>
        </property>
    </bean>

   <!-- Classe de conselho essa classe que será executada -->
   <bean id="aspectBeforMetodo" class="br.com.mder.controller.agente.aspectos.AspectBeforMetodo"/>
   <bean id="aspectAfterMetodo" class="br.com.mder.controller.agente.aspectos.AspectAfterMetodo"/>

As classes que irão executar after ou o befor

Befor

package br.com.mder.controller.agente.aspectos;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

/**
 * classe respnsável  por interceptar requisições de alteração de base
 * antes da chamada.
 * 
 * @author Michel Valentin
 *
 */
public class AspectBeforMetodo implements MethodBeforeAdvice {

	public void before(Method arg0, Object[] arg1, Object arg2)
			throws Throwable {
		

	}

}

After


package br.com.mder.controller.agente.aspectos;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**
 * Classe que irá interceptar as requisicoes do user 
 * Responsável por informar ao agente que houve mudança no ambiente.
 * 
 * @author Michel Valentin
 *
 */
public class AspectAfterMetodo implements AfterReturningAdvice {

	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
			Object arg3) throws Throwable {
		System.out.println(arg0.getClass().getName() + " - " + arg1.getName());

	}

}


“./IBusinessLogic/.foo: This expression selects join points on the foo() method on the IBusinessLogic interface only. This will only select join points on the IBusinessLogic interface if it is one of the beans to which the advisor has been attached.” (Russell Miles, 2004)

Té mais.

Para maiores detalhes consultar referência.

Referência:
http://static.springframework.org/spring/docs/2.0.x/reference/aop.html
http://www.onjava.com/pub/a/onjava/2004/07/14/springaop.html