Spring AOP - PointCut baseado em anotação

JoinPoint

Um JoinPoint representa um ponto em seu aplicativo onde você pode inserir o aspecto AOP. Você também pode dizer que é o lugar real no aplicativo onde uma ação será realizada usando a estrutura Spring AOP. Considere os seguintes exemplos -

  • Todas as classes de métodos contidas em um (s) pacote (s).

  • Métodos específicos de uma classe.

PointCut

PointCut é um conjunto de um ou mais JoinPoint onde um conselho deve ser executado. Você pode especificar PointCuts usando expressões ou padrões, como veremos em nossos exemplos de AOP. Na primavera, PointCut ajuda a usar JoinPoints específicos para aplicar o conselho. Considere os seguintes exemplos -

  • @PointCut ("execução (* com.tutorialspoint. *. * (..))")

  • @PointCut ("execução (* com.tutorialspoint.Student.getName (..))")

Sintaxe

@Aspect
public class Logging {

   @PointCut("execution(* com.tutorialspoint.*.*(..))")
   private void selectAll(){}

}

Onde,

  • @Aspect - Marque uma classe como uma classe que contém métodos de aconselhamento.

  • @PointCut - Marque uma função como PointCut

  • execution( expression ) - Expressão cobrindo métodos nos quais o conselho deve ser aplicado.

Para entender os conceitos mencionados acima relacionados a JoinPoint e PointCut, vamos escrever um exemplo que implementará alguns dos PointCuts. Para escrever nosso exemplo com alguns conselhos, vamos ter um Eclipse IDE funcionando e usar as seguintes etapas para criar um aplicativo Spring -

Degrau Descrição
1 Atualize o projeto que o Aluno criou no capítulo Spring AOP - Aplicativo .
2 Atualize a configuração do bean e execute o aplicativo conforme explicado abaixo.

A seguir está o conteúdo de Logging.javaArquivo. Este é, na verdade, um exemplo do módulo de aspecto, que define os métodos a serem chamados em vários pontos.

package com.tutorialspoint;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Logging {

   /** Following is the definition for a PointCut to select
    *  all the methods available. So advice will be called
    *  for all the methods.
    */
   @PointCut("execution(* com.tutorialspoint.*.*(..))")
   private void selectAll(){}

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   @Before("selectAll()")
   public void beforeAdvice(){
      System.out.println("Going to setup student profile.");
   }  
}

A seguir está o conteúdo do Student.java Arquivo.

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;

   public void setAge(Integer age) {
      this.age = age;
   }
   
   public Integer getAge() {
      System.out.println("Age : " + age );
      return age;
   }

   public void setName(String name) {
      this.name = name;
   }
   
   public String getName() {
      System.out.println("Name : " + name );
      return name;
   }
   
   public void printThrowException(){
      System.out.println("Exception raised");
      throw new IllegalArgumentException();
   }
}

A seguir está o conteúdo do MainApp.java Arquivo.

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
         new ClassPathXmlApplicationContext("Beans.xml");

      Student student = (Student) context.getBean("student");

      student.getName();
      student.getAge();     
   }
}

A seguir está o arquivo de configuração Beans.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:aop = "http://www.springframework.org/schema/aop"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

   <aop:aspectj-autoproxy/>

   <!-- Definition for student bean -->
   <bean id = "student" class = "com.tutorialspoint.Student">
      <property name = "name"  value = "Zara" />
      <property name = "age"  value = "11"/>      
   </bean>

   <!-- Definition for logging aspect -->
   <bean id = "logging" class = "com.tutorialspoint.Logging"/> 
      
</beans>

Executar projeto

Depois de criar os arquivos de origem e configuração, execute seu aplicativo. Clique com o botão direito em MainApp.java em seu aplicativo e userun as Java Applicationcomando. Se tudo estiver bem com seu aplicativo, ele imprimirá a seguinte mensagem.

Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11

O @Pointcut definido acima usa uma expressão para selecionar todos os métodos definidos no pacote com.tutorialspoint. O conselho @Before usa o PointCut definido acima como um parâmetro. Efetivamente, o método beforeAdvice () será chamado antes de cada método coberto pelo PointCut acima.