Spring aop yada aspectj kullanarak exception handling ve validation mimarisini nasıl kurabilirim bu konuyla ilgili profesyonel bir örnek verebilir misiniz?

soruldu: 04 Haz '14, 11:27

alper's gravatar image

alper
96569
cevap kabul oranı: 0%


Güzel soru +1. Soruyu cevaplarken AspectJ üzerinden exception handling yapısına örnek göstererek anlatmaya çalışacağım. Bildiğim ve suana kadarki mevcut AspectJ sistemlerinin bazılarını incelediğim kadarıyla, exception mimarisini Around Advice ( Advice OOP karşılığı olan metotlara denk denebilir) yolu ile AOP mimarisine entegre etme imkanın olabileceğini belirtmek isterim. Bundan başka 2 seçenek daha mevcut yalnız bu 2 yol try/catch bloğundan doğacak exceptionları loglamanı sağlayacak özelliklerdir.

Around advice ile enine kesen ilgilerden (crosscutting concerns) maruz kalan mevcut metodun öncesinde, sonrasında ya da bu mevcut metodu direk pas gecerek yeni ek eylemleri (ör. Logging, Pooling, Monitoring) birleşme noktalarında (Join Points) çalıştırabilirsin. Normalde 1-2 daha özelliği var ama kabaca bu metodun ne için kullanıldığını anlamamız yeterli olucaktır. Artık direk bir exception handling örneğini nasıl AOP mimarisine dönüştürebiliriz ona bir bakalım (Unutmamamız gerekir ki try/catch yapısı her projede hemen hemen uygulanmaktadır ve buda try/catch yapısını enine kesen ilgilerden biri yapmaktadır):

Bir sınıfımız olsun ismi ScriptRunner ve bu sınıfta try/catch yapısı ile çevrelenmiş bir metot bulunsun (runScript):

1  public class ScriptRunner {
2     ...
3     public void runScript(){
4        try{
5            //çevrelenmiş kod bloğu
6        }
7        catch (Exception e){
8          //yakalanan exception e
9        }
10     }
11     ... 
12 }

Bu OOP yaklaşımını şimdi AOP yaklaşımına çevirerek exception handling ilgilerini nasıl AspectJ ile kurabileceğimize bakalım:

1 public aspect ExceptionHandlingAspect{ //ExceptionHandlingAspect.aj
2
3   // Around advice yapısı gereği yanına kattığı method-execution pointcut'ın birleşimi
4   // ile 3-5 satırları arasında oluşan runScript metotdunu tümüyle çevrelemektedir.
5   void around() : execution(void ScriptRunner.runScript()){ 
6      try{
7           proceed(); // çağır void runScript()               
8      } catch(Exception e){
9         // exception yakala
10      }
11  }
12 }

1 public class ScriptRunner { // ScriptRunner.java
2    ...
3 > public void runScript(){
4 >        // try/catch olmayan kod bloğu
5 > }
6    ... 
7}

NOT: proceed metodu sayesinde birleşme noktasındaki mevcut metodu (runScript()) çalıştırıabiliyoruz yani o metodun içindeki kodların çalışmasını sağlıyoruz. Ayrıca, around advice özelliklerinden biri olan pas geçme işlemini proceed metodunu kullanmayarak gerçekleştirebiliriz, ozaman bu around advice sayesinde kendimiz sıfırdan yeni kod blokları ekleyebiliyoruz.

Örnektede görüldüğü gibi, around advice yapısı try/catch için 7 satırdan oluşmaktadır. Daha fazla metodu try/catch ile yakalamak ve daha fazla bu yapıyı metotlara yaymak icin özel semboller (wildcards) kullanılabilir (+, .. (2 nokta), \* (yıldız)). Örnek vermek gerekirse: execution(void ScriptRunner.run*(..)) sayesinde ScriptRunner sınıfındaki tüm run ile başlayan metotlara ulaşır ve hatta bu ulaşılan metotların parametrelerini .. sayesinde atlayabilirsin. + sembolü kalıtım almış sınıflarında run ile başlayan metotlarına erişim imkanı vermektedir.

İlk başta dediğim gibi bu try/catch bloklarınında loglama işleminin yapılabilineceğini söylemiştim. Bunlardan biri After Throwing Advice sayesinde ve bir diğeride handler() pointcut özelliği ile mevcuttur. After throwing advice isminden de anlaşılacağı gibi belirlenen birleşme noktalarında gerçekleşecek herhangi bir hatanın fırlatılmasından sonra bu advice yapısı tetikleniyor ve çalışmaya başlıyor. Örnek vermek gerekirse, gene aynı runScript() metodunu ele alalım ve bunu after throwing göre uyarlayalım:

// Hata fırlatıldıktan sonra bu advice otomatik olarak loga hatanın detaylarını yazıcak.
after() throwing (Exception e): execution(void ScriptRunner.runScript()) {
      Logger.log("Bir hata fırlatıldı: " + e);
}

Diğer özellik olan exception-handler() şu şekilde çalışmakta:

1  public class ScriptRunner {
2     ...
3     public void runScript(){
4        try{
5            //çevrelenmiş kod bloğu
6        }
7        catch (Exception e){
8          // handler() pointcut'ının kontrol ettiği yer
9          mesajYolla(e);
10       }
11     }
12     ... 
13 }

Handler() sayesinde catch bloğunun içine crosscutting kodlarını yazma imkanı tanınmaktadır. 8 ve 9. satırlar bu pointcut sayesinde kontrol edilmekte.

Güzel 2 kaynak olarak bunları incelemende yarar var: http://www.eclipse.org/aspectj/doc/next/progguide/semantics-pointcuts.html ve https://eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html

Son olarak, tavsiyem aşağıda belirttiğim mevcut bilinen AspectJ uygulamalarını incelemen olucaktır. Bu mevcut sistemler cok farklı enine kesen ilgiler barındırmaktadır ve try/catch mimarisi dısında validation yaklaşımınada yardımı olucağını düşünüyorum.

  1. HealthWatcher ( http://www.kevinjhoffman.com/tosem2012/ )
  2. AJHotDraw ( http://ajhotdraw.sourceforge.net/ )
  3. AJHSQLDB ( http://sourceforge.net/projects/ajhsqldb/ )
  4. Contract4J5 ( https://github.com/deanwampler/Contract4J5 )
  5. MobileMedia ( http://sourceforge.net/projects/mobilemedia/ )
  6. iBatis ( http://sourceforge.net/projects/ibatislancaster/ )
  7. Telestrada ( http://www.kevinjhoffman.com/tosem2012/ )
  8. TetrisAJ ( http://www.guzzzt.com/coding/aspecttetris.shtml )
permanent link
Bu kayıt wiki sayfası olarak tanımlanmıştır.

cevaplandı: 01 Tem '14, 07:02

Hakan%20%C3%96zler's gravatar image

Hakan Özler
413
cevap kabul oranı: 50%

değiştirildi: 01 Tem '14, 07:17

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×128
×5

Soruldu: 04 Haz '14, 11:27

Görüntüleme: 666 kez

Son güncelleme: 01 Tem '14, 07:17

powered by BitNami OSQA