Introdução ao Spring AOP

Introdução ao Spring AOP

1. Introdução

Neste tutorial, apresentaremos o AOP (Programação Orientada a Aspectos) com o Spring e começaremos a entender como podemos começar a usar essa poderosa ferramenta em cenários práticos.

Também é possível aproveitarAspectJ’s annotations ao desenvolver usando Spring AOP, mas neste artigo, estamos nos concentrando na configuração principal do Spring AOP baseada em XML.

2. Visão geral

AOP is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. Ele faz isso adicionando comportamento adicional ao código existente sem modificação do próprio código.

Em vez disso, podemos declarar esse novo código e esses novos comportamentos separadamente.

AOP framework de Spring nos ajuda a implementar essas questões transversais.

3. Dependências do Maven

Vamos começar adicionando a dependência da biblioteca AOP do Spring empom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    1.5.7.RELEASE



    
        org.springframework.boot
        spring-boot-starter-aop
    

A versão mais recente da dependência pode ser verificadahere.

4. Conceitos e terminologia de AOP

Vamos revisar brevemente os conceitos e a terminologia específicos para AOP:

image

4.1. Objeto de negócios

Um objeto de negócios é uma classe normal que possui uma lógica de negócios normal. Vejamos um exemplo simples de um objeto de negócios onde apenas adicionamos dois números:

public class SampleAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

Observe que esta classe é uma classe normal com lógica de negócios e sem nenhuma anotação relacionada ao Spring.

4.2. Aspecto

Um aspecto é uma modularização de uma preocupação que abrange várias classes. O registro unificado pode ser um exemplo dessa preocupação transversal.

Vamos ver como definimos um aspecto simples:

public class AdderAfterReturnAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public void afterReturn(Object returnValue) throws Throwable {
        logger.info("value return was {}",  returnValue);
    }
}

No exemplo acima, acabamos de definir uma classe Java simples que tem um método chamadoafterReturn que recebe um argumento do tipoObject e apenas registra esse valor. Observe que mesmo nossoAdderAfterReturnAspect é uma classe padrão, livre de quaisquer anotações do Spring.

Nas próximas seções, veremos como podemos conectar este Aspecto ao nosso Objeto de Negócio.

4.3. Joinpoint

UmJoinpoint é um ponto durante a execução de um programa, como a execução de um método ou o tratamento de uma exceção.

No Spring AOP, aJoinPoint sempre representa a execução de um método.

4.4. Pointcut

Um Pointcut é um predicado que ajuda a combinar umAdvice a ser aplicado por umAspect em umJoinPoint específico.

O Conselho é freqüentemente associado a uma expressãoPointcute executa em qualquerJoinpoint correspondido pelo Pointcut.

4.5. Adendo

Um conselho é uma ação realizada por um aspecto em um determinadoJoinpoint. Diferentes tipos de aconselhamento incluem“around,” “before”e“after”.

Na primavera, umAdvice é modelado como um interceptor, mantendo uma cadeia de interceptores em torno deJoinpoint.

4.6. Objeto e aspecto de negócios de fiação

Vejamos como podemos conectar um objeto de negócios a um aspecto com um conselho de pós-retorno.

Abaixo está o trecho de configuração que colocaríamos em uma configuração Spring padrão na tag“<beans>”:




    
       
       
    

Como pode ser visto, definimos um bean simples chamadosimpleAdder que representa uma instância de um Objeto de Negócios. Além disso, estamos criando uma instância de um aspecto chamadoAdderAfterReturnAspect.

É claro que XML não é nossa única opção aqui; conforme mencionado antes, as anotaçõesAspectJ também são totalmente suportadas.

4.7. Visão geral da configuração

Tagaop:config é usado para definir a configuração relacionada ao AOP. Within the config tag, we define the class that represents an aspect. Demos a ele uma referência do bean de aspecto“doAfterReturningAspect” que criamos.

A seguir, definimos um Pointcut usando a tagpointcut. O ponto de corte usado no exemplo acima éexecution(* org.example.logger.SampleAdder+.*(..)), o que significa aplicar um conselho sobre qualquer método dentro da classeSampleAdder que aceita qualquer número de argumentos e retorna qualquer tipo de valor.

Em seguida, definimos quais conselhos queremos aplicar. No exemplo acima, vamos aplicar o conselho após o retorno que é definido em nosso AspectoAdderAfterReturnAspect executando o método denominadoafterReturn definido usando o método de atributo.

Este conselho dentro do Aspect leva um parâmetro do tipoObject. O parâmetro nos dá a oportunidade de realizar uma ação antes e / ou depois da chamada do método de destino. Nesse caso, apenas registramos o valor de retorno do método.

Spring AOP suporta vários conselhos usando configuração baseada em anotação - este e mais exemplos podem ser encontradoshereehere.

5. Conclusão

Neste tutorial, ilustramos os conceitos usados ​​no AOP e o exemplo do uso do módulo AOP do Spring. Se você estiver interessado em descobrir mais sobre AOP, aqui estão alguns recursos:

A implementação desses exemplos pode ser encontrada emthe GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.