Spring AOP - XML ​​Based PointCut

Ponto de junção

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á executada 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 JoinPoints 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 -

  • expressão = "execução (* com.tutorialspoint. *. * (..))"

  • expressão = "execução (* com.tutorialspoint.Student.getName (..))"

Sintaxe

<aop:config>
   <aop:aspect id = "log" ref = "adviceClass">
      <aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>    
   </aop:aspect>
</aop:config>

Onde,

  • adviceClass - ref da classe contendo métodos de aconselhamento

  • PointCut-id - id do 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. Na verdade, este é um exemplo de módulo de aspecto, que define os métodos a serem chamados em vários pontos.

package com.tutorialspoint;

public class Logging {

   /** 
    * This is the method which I would like to execute
    * before a selected method execution.
    */
   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:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
         expression = "execution(* com.tutorialspoint.*.*(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>         
      </aop:aspect>
   </aop:config>

   <!-- 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>

Quando terminar de criar os arquivos de configuração de origem e bean, execute o aplicativo. Se tudo estiver bem com o seu aplicativo, ele imprimirá a seguinte mensagem.

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

O <aop: pointcut> definido acima seleciona todos os métodos definidos no pacote com.tutorialspoint. Suponhamos que você queira executar seu conselho antes ou depois de um método específico, você pode definir seu PointCut para restringir sua execução substituindo as estrelas (*) na definição de PointCut por nomes reais de classes e métodos. A seguir está um arquivo de configuração XML modificado para mostrar o conceito.

<?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:config>
      <aop:aspect id = "log" ref = "logging">
         <aop:PointCut id = "selectAll" 
            expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
         <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
      </aop:aspect>
   </aop:config>

   <!-- 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 o seu aplicativo, ele imprimirá a seguinte mensagem.

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