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:
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.
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á.