AspectJ

AspectJ Plugin


O plugin do AspectJ é utilizado com o maven para adicionar nos projetos uma extensão aos principios da OO, nesse contexto a Programação Orientada a Aspecto, prometo suprir alguns requisitos que a Orientação a Objetos é deficiente, pois permite separar em tempo de projeto requisitos funcionais de requisitos não funcionais.

Vamos ver nesse exemplo, como configurar o plugin do AspectJ para projetos Maven.

Configurando o AspectJ Plugin

A configuração dentro do pom.xml é bem fácil, basta adicionar na sessão plugins o seguinte trecho:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <version>1.4</version>

  <configuration>
    <source>${maven.compiler.source}</source>
    <target>${maven.compiler.target}</target>
  </configuration>
        
  <executions>
    <execution>
      <goals>
        <goal>compile</goal> 
        <goal>test-compile</goal> 
      </goals>
    </execution>
  </executions>
</plugin>

Codificando o Aspecto

Uma vez o plugin configurado, o próximo passo é a criação do Aspecto, onde definimos o pointcut, ou seja, toda vez que um método de Objeto da Aplicação for chamado e seja executado algo, como por exemplo o registro de um log, definimos atraves de regras da programação orientada a aspecto.

Segue o exemplo de um código de Aspecto:

public aspect Logging {
  // Definicao de Pointcut
  pointcut logOnExecuteSet(): execution (public String print*());

  before(): logOnExecuteSet() {
    System.out.println("Entering: " + thisJoinPoint);
  }

  after() returning: logOnExecuteSet() {
    System.out.println("After Returning: " + thisJoinPoint);
  }
}

Estamos definindo um pointcut para o todo método que possui a seguinte Assinatura: public String print*(), ou seja, todo método chamado, que se inicia por public String print* sem parâmetro, teremos a invocação do aspecto pelo mecanismo de runtime do AspectJ.

No exemplo mostrado, toda ver que o método print* for chamado, teremos antes da execução do método a execução do before() e após a execução do método a chamada a after().

Rodando o exemplo

Uma vez configurado o projeto e o aspecto criado, já podemos executar um teste para ver como é o funcionamento do uso da API.

Primeiro vamos compilar o programa, para isso, digitar o comando:

mvn package

O programa será compilado, em seguida vamos utilizar o plugin exec, para executar programas em java, modo standalone:

mvn exec:java

Será exibida a mensagem abaixo, indicando que está tudo correto:

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building JarExample 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ JarExample >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ JarExample <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ JarExample ---
Entering: execution(String br.com.javadev.aspectj.HelloWorld.printHello())
After Returning: execution(String br.com.javadev.aspectj.HelloWorld.printHello())
RET: Hello ! Javadev
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.478s
[INFO] Finished at: Fri Jul 12 14:28:27 BRT 2013
[INFO] Final Memory: 2M/15M
[INFO] ------------------------------------------------------------------------


Downloads

Para fazer o download do exemplo, clique em: Exemplo do tutorial.