İlkbahar AOP - Uygulamalar

Bahar, @AspectJ annotation style yaklaşım ve schema-based özel yönleri uygulama yaklaşımı.

XML Şeması Tabanlı

Yönler, XML tabanlı yapılandırmanın yanı sıra normal sınıflar kullanılarak uygulanır.

Bu bölümde açıklanan AOP ad alanı etiketlerini kullanmak için, aşağıda açıklanan yay AOP şemasını içe aktarmanız gerekir -

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

   <!-- bean definition & AOP specific configuration -->

</beans>

Bir Unsur Bildirmek

Bir aspect kullanılarak beyan edilmiştir <aop:aspect> öğesi ve destek fasulyesi kullanılarak referans alınır ref aşağıdaki gibi öznitelik.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Burada "aBean" yapılandırılacak ve önceki bölümlerde gördüğünüz gibi diğer Spring Bean'ler gibi bağımlılık enjekte edilecektir.

PointCut Bildirmek

Bir PointCutfarklı tavsiyelerle yürütülecek ilgilenilen birleşme noktalarının (yani yöntemler) belirlenmesine yardımcı olur. XML Şeması tabanlı konfigürasyon ile çalışırken PointCut şu şekilde tanımlanacaktır -

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">

   <aop:PointCut id = "businessService"
      expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
      ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Aşağıdaki örnek, com.tutorialspoint paketi altındaki Student sınıfında bulunan getName () yönteminin yürütülmesiyle eşleşecek 'businessService' adlı bir PointCut tanımlar.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">

   <aop:PointCut id = "businessService"
      expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Beyan Tavsiyeleri

Aşağıdaki gibi <aop: {ADVICE NAME}> öğesini kullanarak beş tavsiyeden herhangi birini <aop: angle> içinde bildirebilirsiniz.

<aop:config>
   <aop:aspect id = "myAspect" ref = "aBean">
      <aop:PointCut id = "businessService"
         expression = "execution(* com.xyz.myapp.service.*.*(..))"/>

      <!-- a before advice definition -->
      <aop:before PointCut-ref = "businessService" 
         method = "doRequiredTask"/>

      <!-- an after advice definition -->
      <aop:after PointCut-ref = "businessService" 
         method = "doRequiredTask"/>

      <!-- an after-returning advice definition -->
      <!--The doRequiredTask method must have parameter named retVal -->
      <aop:after-returning PointCut-ref = "businessService"
         returning = "retVal"
         method = "doRequiredTask"/>

      <!-- an after-throwing advice definition -->
      <!--The doRequiredTask method must have parameter named ex -->
      <aop:after-throwing PointCut-ref = "businessService"
        throwing = "ex"
         method = "doRequiredTask"/>

      <!-- an around advice definition -->
      <aop:around PointCut-ref = "businessService" 
         method = "doRequiredTask"/>
   ...
   </aop:aspect>
</aop:config>

<bean id = "aBean" class = "...">
   ...
</bean>

Aynısını kullanabilirsin doRequiredTaskveya farklı tavsiyeler için farklı yöntemler. Bu yöntemler, görünüş modülünün bir parçası olarak tanımlanacaktır.

@AspectJ tabanlı

@AspectJ, Java 5 açıklamaları ile açıklamalı normal Java sınıfları olarak durumları bildirme stilini ifade eder. @AspectJ desteği, XML Şema tabanlı yapılandırma dosyanıza aşağıdaki öğe eklenerek etkinleştirilir.

<aop:aspectj-autoproxy/>

Bir Unsur Bildirmek

Yön sınıfları, diğer normal bean'lere benzer ve aşağıdaki gibi @Aspect ile açıklama eklenmeleri dışında, diğer sınıflar gibi yöntemlere ve alanlara sahip olabilir.

package org.xyz;

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AspectModule {

}

Diğer fasulye türleri gibi XML'de aşağıdaki gibi yapılandırılacaklar.

<bean id = "myAspect" class = "org.xyz.AspectModule">
   <!-- configure properties of aspect here as normal -->
</bean>

PointCut Bildirmek

Bir PointCutfarklı tavsiyelerle yürütülecek ilgilenilen birleşme noktalarının (yani yöntemler) belirlenmesine yardımcı olur. @AspectJ tabanlı yapılandırmayla çalışırken, PointCut bildiriminin iki bölümü vardır -

  • Tam olarak hangi yöntem yürütmeleriyle ilgilendiğimizi belirleyen bir PointCut ifadesi.

  • Bir ad ve herhangi bir sayıda parametre içeren bir PointCut imzası. Yöntemin gerçek gövdesi konu dışıdır ve aslında boş olmalıdır.

Aşağıdaki örnek, com.xyz.myapp.service paketi altındaki sınıflarda bulunan her yöntemin yürütülmesiyle eşleşecek 'businessService' adlı bir PointCut tanımlar.

import org.aspectj.lang.annotation.PointCut;

@PointCut("execution(* com.xyz.myapp.service.*.*(..))") // expression 
private void businessService() {}  // signature

Aşağıdaki örnek, com.tutorialspoint paketi altındaki Student sınıfında bulunan getName () yönteminin yürütülmesiyle eşleşen 'getname' adlı bir PointCut tanımlar.

import org.aspectj.lang.annotation.PointCut;

@PointCut("execution(* com.tutorialspoint.Student.getName(..))") 
private void getname() {}

Beyan Tavsiyeleri

Aşağıda verilen @ {ADVICE-NAME} ek açıklamalarını kullanarak beş tavsiyeden herhangi birini beyan edebilirsiniz. Bu, zaten bir PointCut imza yöntemi businessService () tanımladığınızı varsayar.

@Before("businessService()")
public void doBeforeTask(){
   ...
}

@After("businessService()")
public void doAfterTask(){
   ...
}

@AfterReturning(PointCut = "businessService()", returning = "retVal")
public void doAfterReturnningTask(Object retVal){
   // you can intercept retVal here.
   ...
}

@AfterThrowing(PointCut = "businessService()", throwing = "ex")
public void doAfterThrowingTask(Exception ex){
   // you can intercept thrown exception here.
   ...
}

@Around("businessService()")
public void doAroundTask(){
   ...
}

Herhangi bir tavsiye için PointCut satır içi tanımlayabilirsiniz. Aşağıda, tavsiye için satır içi PointCut tanımlamak için bir örnek verilmiştir.

@Before("execution(* com.xyz.myapp.service.*.*(..))")
public doBeforeTask(){
   ...
}