Spring – 27 – Aspect Oriented Programming (AOP) – 01

Merhaba Arkadaslar
Bu bolumde Aspect Oriented Programming (AOP) kavramina deginecegiz.

Hello AOP

Aspect ; hal/görünüş/yön/açı gibi anlamlara gelmektedir (tureng.com).
Spring Framework , Dependency Injection mekanizmasi yaninda bir baska core feature (temel ozellik) olarak Aspect Oriented Programming destegi sunar.

Transcation , Logging , Security , Caching gibi konular crosscutting concern olarak isimlendirilmektedir.

Asagidaki image’i inceleyecek olursak ;
Service siniflarinda Logging , Security , Transaction module’leri kullanilmaktadir.

cross-cutting

Bir baska ornek olarak Wikipedia’da yer alan su kodu inceleyelim ;

Aspect-oriented programming

Banka hesabindan bir para transfer kodu dusunelim en temel olarak ;

void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {
  if (fromAcc.getBalance() < amount)
      throw new InsufficientFundsException();

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);
}

Bununla birlikte bu kod gercek bir uygulama icin son derece yetersiz ve ciddi problemler icermektedir.

  • Kodda herhangi bir authorisation (yetki) kontrolu yer almiyor
  • Data Integrity adina herhangi bir transaction yonetimi yer almiyor.
    Ornegin hesaptan para cekildi , diger hesaba gitmeden bir hata oldugunda roll-back islemi yapilmayacagi icin para havaya ucacaktir.
  • Loglama yer almiyor
void transfer(Account fromAcc, Account toAcc, int amount, User user,
    Logger logger, Database database) throws Exception {
  logger.info("Transferring money...");
  
  if (!isUserAuthorised(user, fromAcc)) {
    logger.info("User has no permission.");
    throw new UnauthorisedUserException();
  }
  
  if (fromAcc.getBalance() < amount) {
    logger.info("Insufficient funds.");
    throw new InsufficientFundsException();
  }

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);

  database.commitChanges();  // Atomic operation.

  logger.info("Transaction successful.");
}

Kodu inceleyecek olursak oncelikle guvenlik kontrolu yapilmaktadir ,(security) , sonrasinda business kontroller yapilmaktadir.
Transaction yonetimi ve asil business yapildiktan sonra loglama yapilmaktadir.

Business Logic icerisinde Logging , Security , Transaction ya da diger baska Crosscutting Corncern’ler yer alacaktir.
Aslinda asil isi yaptigimiz kisim 2 satirdir ;

fromAccount.withdraw(amount);
toAccount.deposit(amount);

Diger kisimlar da tabi ki olmazsa olmaz kisimlardir. Iste bu code duplication’a neden olan kisimlari business logic’ten cikartmak icin AOP yaklasimini kullanabiliriz.

Spring Reference Documentation’da soyle der ;

Aspect-Oriented Programming (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure.
The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect.
Spring Framework Reference Documentation

AOP (Aspect Oriented Programming) teknigi , OOP (Object Oriented Programming) teknigine bir alternatif degildir ! Tam tersine AOP teknigi , OOP teknigini tamamlamaktadir.

AOP teknigi , separation of crosscutting concern ile modulerlik/modularity arttirmayi hedefler.
OOP acisindan baktigimizda modulerligi Class’lar ile saglariz , AOP acisindan baktigimizda bu modulerligi aspect’ler yardimi ile saglariz.

Crosscutting concern , yukarida bahsettigimiz gibi projede bir cok noktada gerekli olan , business logic’e tight coupled olarak bagli islerdir. (concern)
Enterprise bir uygulama dusundugumuzde bu concern’lerin bir veya bir kac mutlaka olacaktir.

Crosscutting Concern’lerin ayrilmasi(separation) ile kodumuz daha temiz/clean ve moduler olacaktir.

AOP Alliance

Spring , AOP Alliance arabirimlerini kullanir.
http://aopalliance.sourceforge.net/

The AOP Alliance project is a joint open-source project between several software engineering people who are interested in AOP and Java.

AOP Alliance projesi , Java ve AOP ile ilgilenen bir cok yazilim muhendisinin ortak bir caba sonrasi ortaya cikan bir open-source/acik kaynak kodli projedir.

2 farkli AOP teknigi vardir ; static ve dynamic
Spring AOP , Dynamic AOP yaklasimini kullanir. Weaving islemi calisma zamainda/runtime dinamik olarak gerceklestirilir.

Weaving , aspect’leri uygulama koduna (application code) uygun noktaya (point) ekleme islemidir. Compile-time ya da runtime’da yapilabilir.

Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

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