Explicação leiga para alguém que é novo para os conceitos AOP. Isso não é exaustivo, mas deve ajudar na compreensão dos conceitos. Se você já está familiarizado com o jargão básico, pode parar de ler agora.
Suponha que você tenha uma classe normal Employee e deseja fazer algo sempre que esses métodos são chamados.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
esses métodos são chamados de JoinPoints . Precisamos de uma maneira de identificar esses métodos para que o framework possa encontrar os métodos, entre todas as classes.métodos que carregou. Portanto, escreveremos uma expressão regular para corresponder à assinatura desses métodos. Embora haja mais do que isso, como você verá a seguir, mas vagamente, essa expressão regular é o que define o Pointcut . por exemplo
* * mypackage.Employee.get*(*)
O primeiro * é para o modificador público / privado / protegido / padrão. O segundo * é para o tipo de retorno do método.
Mas então você também precisa dizer mais duas coisas:
- Quando uma ação deve ser realizada - por exemplo, antes / depois da execução do método OU na exceção
- O que deveria fazer quando corresponder (talvez apenas imprimir uma mensagem)
A combinação dos dois é chamada de Conselho .
Como você pode imaginar, você teria que escrever uma função para poder fazer o # 2. Portanto, é assim que deve parecer para o básico.
Nota: Para maior clareza, use a palavra REGEX em vez de * * mypackage.Employee.get*(*)
. Na realidade, a expressão completa entra na definição.
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
Depois de começar a usá-los um pouco, você pode acabar especificando muitos avisos @ After / @ Before / @ Around. As expressões regulares repetidas acabarão tornando as coisas confusas e difíceis de manter. Portanto, o que fazemos é apenas dar um nome à expressão e usá-la em todos os outros lugares da classe Aspect.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
BTW, você também gostaria de envolver toda essa lógica em uma classe, que é chamada de Aspect, e escreveria uma classe:
@Aspect
public class MyAwesomeAspect{....}
Para fazer todas essas coisas funcionarem, você teria que dizer ao Spring para analisar as classes para ler, entender e agir nas palavras-chave @ AOP. Uma maneira de fazer isso é especificando o seguinte no arquivo xml de configuração do spring:
<aop:aspectj-autoproxy>