Spring AOP - XML ​​Tabanlı PointCut

Birleşme Noktası

JoinPoint, uygulamanızda AOP yönünü ekleyebileceğiniz bir noktayı temsil eder. Ayrıca Spring AOP çerçevesi kullanılarak bir eylemin yapılacağı uygulamada gerçek yer diyebilirsiniz. Aşağıdaki örnekleri düşünün -

  • Bir paket (ler) de bulunan tüm yöntem sınıfları.

  • Bir sınıfın belirli yöntemleri.

PointCut

PointCut, bir tavsiyenin yürütülmesi gereken bir veya daha fazla JoinPoints kümesidir. AOP örneklerimizde göreceğimiz gibi, ifadeleri veya kalıpları kullanarak PointCuts belirtebilirsiniz. İlkbaharda PointCut, tavsiyeleri uygulamak için belirli JoinPuan'ları kullanmaya yardımcı olur. Aşağıdaki örnekleri düşünün -

  • ifade = "yürütme (* com.tutorialspoint. *. * (..))"

  • ifade = "yürütme (* com.tutorialspoint.Student.getName (..))"

Sözdizimi

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

Nerede,

  • adviceClass - tavsiye yöntemlerini içeren sınıfın ref

  • PointCut-id - PointCut kimliği

  • execution( expression ) - Tavsiyenin uygulanacağı yöntemleri kapsayan ifade.

JoinPoint ve PointCut ile ilgili yukarıda bahsedilen kavramları anlamak için, PointCut'ların birkaçını uygulayacak bir örnek yazalım. Örneğimizi birkaç tavsiyeyle yazmak için, yerinde çalışan bir Eclipse IDE'ye sahip olalım ve bir Spring uygulaması oluşturmak için aşağıdaki adımları kullanalım.

Adım Açıklama
1 İlkbahar AOP - Uygulama bölümünde oluşturulan öğrenci projesini güncelleyin .
2 Fasulye yapılandırmasını güncelleyin ve uygulamayı aşağıda açıklandığı gibi çalıştırın.

Aşağıdakilerin içeriği Logging.javadosya. Bu aslında çeşitli noktalarda çağrılacak yöntemleri tanımlayan bir görünüm modülü örneğidir.

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şağıdakilerin içeriği Student.java dosya.

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şağıdakilerin içeriği MainApp.java dosya.

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();     
   }
}

Yapılandırma dosyası aşağıdadır 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>

Kaynak ve bean yapılandırma dosyalarını oluşturmayı tamamladığınızda uygulamayı çalıştırın. Uygulamanızda her şey yolundaysa, aşağıdaki mesajı yazdıracaktır.

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

Yukarıda tanımlanan <aop: pointcut>, com.tutorialspoint paketi altında tanımlanan tüm yöntemleri seçer. Farz edelim ki, tavsiyenizi belirli bir yöntemden önce veya sonra yürütmek istiyorsanız, PointCut tanımındaki yıldızları (*) gerçek sınıf ve yöntem adlarıyla değiştirerek, PointCut'unuzu yürütmenizi daraltmak için tanımlayabilirsiniz. Aşağıda, kavramı göstermek için değiştirilmiş bir XML yapılandırma dosyası verilmiştir.

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

Projeyi Çalıştır

Kaynak ve yapılandırma dosyalarını oluşturmayı tamamladığınızda, uygulamanızı çalıştırın. Uygulamanızda MainApp.java'ya sağ tıklayın verun as Java Applicationkomut. Uygulamanızda her şey yolundaysa, aşağıdaki mesajı yazdıracaktır.

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