Spring – Ders 2 AOP (Aspect Orientation Programming)

Merhaba Arkadaslar, bu dersimizde bir onceki dersteki ornegimiz uzerinden devam edecegiz ve Aspect Orientation Programming hakkinda kucuk bir uygulama yapacagiz.

AOP kullanarak tasarlanmasi, anlamasi ve gunellemesi kolay gerceklestirimler ortaya cikartabiliriz.

AOP transcation yonetimi veya loglama benzeri durumlarda ortaya cikan sorunlari cozmeye yonelik olarak birden fazla tur ve nesne uzerinde modulerlik saglar.

Bir yazilim sistemi bir cok birlesenden olusmustur ve her birinin farkli sorumluluklari ve fonksiyonelligi vardir. Bu bilesenler temel fonksiyonellerine ek olarak ek gorevler ustlenebilirler. Transcation, Logging , Guvenlik gibi…

Bu gibi sistem servisleri genellikle cross-cutting concern olarak bilinmektedir. Cunku birden fazla birleseni kesme egilimindedir 🙂

Sistemde bu servisleri anlayabilmek icin birden fazla bileseni incelemek gerekir.
Farkli bir modul olarak tanimlansalar bile cross-cutting concern ler code duplication ina neden olurlar.

spring_02_01

Bu konuya ilerleyen derslerde tekrar donecegiz.

Simdi ornek uygulamamizi yapalim ve uzerinde bazi aciklamalar ile devam edelim.

ilk ornekteki paketi kopyalayip erguder.levent_02.spring ismini verdim.
Ilk ornegimizde Mecnun sinimiz vardi, burada DivaneAsik isimli yeni bir interface olusturdum ve Mecnun sinifi DivaneAsik interface sini uygulamaktadir.

DivaneAsik.java

 
package erguder.levent_02.spring;

public interface DivaneAsik {
  void collereDus();
}

Mecnun.java

package erguder.levent_02.spring;

public class Mecnun implements DivaneAsik {
  private Masuk masuk;

  public Mecnun(Masuk masuk) {
    this.masuk = masuk;  
  }

  @Override
  public void collereDus(){
    masuk.vefaGosterme();
  }
}

Vuslat isminde yeni bir sinif olusturdum burada 2 tane metot bulunmaktadir.

Vuslat.java

package erguder.levent_02.spring;

public class Vuslat {
  public void vuslattanOnce() {     
    System.out.println("#####Vuslattan Once#####");
  }

  public void vuslattanSonra() {   
    System.out.println("#####Vuslattan Sonra####\");
  }
}

xml dosyamizin icerisine bakalim ve uzerinden konusalim.

spring_02_02

 

<?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 id="mecnunId" class="erguder.levent_02.spring.Mecnun">
    <constructor-arg ref="leylaId" />       
  </bean>

  <bean id="leylaId"
        class="erguder.levent_02.spring.Leyla" />

  <bean id="vuslatId" 
     class="erguder.levent_02.spring.Vuslat" />

  <aop:config>
    <aop:aspect ref="vuslatId">

      <aop:pointcut id="pointCutId" 
          expression="execution(* *.collereDus(..))" /> 

      <aop:before pointcut-ref="pointCutId"
                  method="vuslattanOnce"/>   

      <aop:after pointcut-ref="pointCutId"
                 method="vuslattanSonra"/>     

    </aop:aspect>
  </aop:config>  
</beans>

oncelikle dikkat ederseniz, kirmizi okla gosterilen kisimlar eklendi xmls:aop eklenmezse <aop:config> hata verecektir.
Bir onceki ornegimizde oldugu gibi 1 ve 2 numara ile gosterilen bean tanimlamalari aynen kaldi.
3 numarali bean ise eklendi, dikkat ederseniz Vuslat sinifina ait bean.
Son olarak da bir nokta kumesi tanimlanmaktadir. Bunu biraz acalim…

Bir aspect, Spring uygulama baglaminda bir bean gibi tanimlanmis olan basit bir java  nesnesidir.
Aspect tanimi <aop:aspect> elemani kullanilarak yapilmaktadir.
Bir nokta kumesi  <aop:config> icerisinde de tanimlanabilir ve diger bean e referans ref degeriyle verilir.

Advice (tavsiye) tanimlama;
Bir tavsiye bir pointcut(nokta kumeleri) ifadesiyle iliskilidir ve metot isletiminden once (before advice) , sonra (after ) ve etrafinda (around) pointcut tarafindan eslenir.

Before Advice
Bu tavsiye turu eslenmis bir metot isletiminden once calisir.

After Returning Advice
Bu tavsiye turu eslenmis bir metot isleminin normal sonlanmasi durumunda calisacaktir.

Xml dosyamiza dikkat ederseniz, collereDus metodundan once,(execution(* *.collereDus(..))”),  vuslattanOnce metodunu cagir,  ( <aop:before > ) ,sonra ise vuslattanSonra metodunu cagir denmektedir.

MecnunAOPTest sinifimizi calistiralim ve sonucu gorelim..

MecnunAOPTest.java

package erguder.levent_02.spring;

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

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

   DivaneAsik mecnun = (DivaneAsik) context.getBean("mecnunId");
   // Mecnun mecnun = (Mecnun) context.getBean("mecnunId"); hata verecektir
    mecnun.collereDus();
  }
}

ve mutlu son…

spring_02_03

Bu  dersimizin sonuna geldik 🙂

Kaynak kodlar: SpringProject_v2

aopalliance-1.0.jar
aspectjweaver-1.6.4.jar jarlarini da projenize eklemeniz gerekmekte.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *