O objetivo da Aspect Oriented Programming (AOP), é retirar o código conhecido como: emaranhado, intrusivo e muitas vezes, replicado em diversos locais do sistema, centralizando-os, tornando os interesses transversais modularizados na aplicação. O código no qual a AOP propõe-se a manter, não faz parte do domínio do sistema. Portanto, é considerado um requisito sistêmico, como: Auditoria, Controle de Falhas, etc. Assim, a AOP visa consequentemente reforçar o conceito de coesão da Orientação a Objetos (OO). Ao conseguirmos extrair a porção de código não inerente ao domínio do sistema, teremos códigos legíveis, de fácil manutenção, podendo ser reutilizado, e por fim coeso. Enfim vamos ao que interessa!

Vamos então conhecer os principais componentes da AOP: Join Points, PointCuts, Advice e o próprio Aspect (que seria a junção de todos). Para nos familiarizar com essas nomenclaturas, definirei cada uma delas a seguir.

<,p>JoinPoints (pontos de junção): eles indicam os locais onde os advices(o que deverá ser executado) serão ligados. Para melhor compreender, seria a execução de um método, atribuição de um valor(setAtributo()), instanciação de um objeto, etc.

Listagem 1: Ponto de junção

void add(){ //Ponto de junção 

}
Pointcuts(Ponto de atuação): servem para definir em quais eventos os advice serão disparados/executados, ou seja, a ligação/definição do advice a um determinado método por exemplo. Para entender melhor a diferença entre ponto de junção e ponto de atuação, entenda o seguinte: já sabemos que o JoinPoint é o foco onde o advice será atrelado (por exemplo a chamada de um método). Porém o Pointcut, indica ao advice quando ele deverá ser executado, por exemplo:

- Imaginem uma classe chamada Noticias, essa tendo um método getNoticia(). Porém, este método poderá ser sobrecarregado, getNoticias(String titulo). Então, como o advice(processo a ser executado) irá saber o momento certo para entrar em ação? A qual método estará vinculado? É nesse momento que entra o poder do pointcut, para dizer quando o advice entrará em execução, se será relacionado a getNoticia() ou getNoticias(String titulo).

O Advice: como já devem ter percebido, é a operação a ser executada a cada JoinPoint. O local onde estará o trecho de código que será executado quando é identificado a execução de um JoinPoint.

Inserção: Com a AOP, podemos realizar inserções de componentes no código, em tempo de execução. Quando estamos trabalhando com aspectos, podemos querer que, em tempo de execução, a estrutura de uma classe ou até mesmo do sistema seja alterado. Adicionando novos métodos, atributos, definir que uma classe implementa uma determinada Interface ou herda de uma outra classe. Tudo isso existe apenas em tempo de execução, a classe “real”, não possuirá essas características de fato.

Declaração em tempo de compilação: A ideia dessa instrução é declarar alertas/erros. Como? Bom, um programador poderia por “N” fatores querer explicitar que não se pode chamar um método em um determinado momento, ou trazendo um exemplo prático, indicar que um código do Hibernate (framework de mapeamento objeto relacional), não pode ser usado no código cliente do GWT (Google Web Toolkit).

O aspecto:  é a união de todos esses atributos citados, adicionando ainda as inserções e declarações.

Para a implementação de aspectos em uma aplicação Java por exemplo, poderemos utilizar a linguagem AspectJ ou o framework Spring (que utiliza em seu core, a linguagem AspectJ). Para que tem o hábito de trabalhar com o Eclipse IDE, basta fazer o download do plugin, AspectJ Development Tools (AJDT), no link http://www.eclipse.org/ajdt/ .