Aspektirano Programiranje Master
Aspektirano Programiranje Master
Matematiki fakultet
Master teza
Ivan Ciki
Beograd
2008
Aspektno Orijentisano Programiranje Ivan Ciki
Sadraj
1. Uvod.............................................................................................. 3
2. AOP metodologija ......................................................................... 4
2.1 Simptomi isprepletanih dunosti ..................................................................... 4
2.1.1 Preplitanje koda .................................................................................................... 4
2.1.2 Rasipanje koda ...................................................................................................... 5
2.2 Posledice nemodularnosti .............................................................................. 6
2.3 Modularnost uz pomo AOP-a ....................................................................... 7
2.4 AOP specifikacija jezika ................................................................................. 9
2.5 AOP implementacija ....................................................................................... 9
2.6 AOP terminologija......................................................................................... 11
2.7 Istorija AOP-a ............................................................................................... 11
2.8 Prednosti i mane AOP-a............................................................................... 12
3. AspectJ ....................................................................................... 13
3.1 Take spajanja (Join Points) ........................................................................ 13
3.2 Take preseka (Pointcuts)............................................................................ 14
3.2.1 AspectJ jezik za izraavanje taaka preseka ....................................................... 14
3.2.1.1 Sintaksa potpisa programskih elementa............................................................................ 15
3.2.1.2 Podela taaka preseka ...................................................................................................... 16
3.2.1.2.1 Direktne take preseka .................................................................................................. 16
3.2.1.2.2 Indirektne take preseka ................................................................................................ 17
3.3 Savet (Advice) .............................................................................................. 18
3.3.1 Klasifikacija saveta............................................................................................... 18
3.4 Statiko preplitanje ....................................................................................... 20
3.4.1 Meu-tipovne deklaracije ..................................................................................... 20
3.4.2 Upozorenja/greke prilikom kompajliranja ............................................................ 20
3.5 AspectJ tkalac (Weaver)............................................................................... 21
3.5.1 Mehanizimi umetanja koda................................................................................... 21
4. Objektno Orjentisani Dizajn (OOD) i AOP ................................... 22
4.1 Isprepletana struktura projektnih obrazaca................................................... 22
4.2 Izazovi u implementaciji projektnih obrazaca ............................................... 22
4.3 Primer korienja AspectJ-a u implementaciji projektnih obrazaca:
Observer obrazac ............................................................................................... 22
4.3.1. Subjekat i Posmatra uloge................................................................................. 24
4.3.2. Subjekt-Posmatra veza ..................................................................................... 24
4.3.3 Opta logika auriranja ........................................................................................ 25
4.3.4 Konkretni aspekti u Observer obrascu ................................................................. 25
4.4 Poboljanja u implementaciji projektnih obrazaca koristei AOP ................. 25
5. Zakljuak ..................................................................................... 27
Dodatak - Primer implementacije bankarskog sistema koristei AOP28
D.1. Pregled reenja implementacije i korienih tehnologija............................. 28
D.2. Implementacija kontrole pristupa (sigurnosne logike) ................................. 31
D.3. Validacija ulaznih podataka ....................................................................... 33
D.4. Upravljanje transakcijama u radu sa bazom podataka................................ 34
D.5. Logovanje izvrenih operacija..................................................................... 35
Reference ....................................................................................... 36
2
1. Uvod
Softverski sistemi svakim danom postaju sve kompleksniji i svi indikatori pokazuju da e se takav
trend nastaviti u budunosti. Programeri se susreu sa sve sloenijim i obimnijim zahtevima,
samim tim je sve tee napraviti dobar dizajn, tj. dizajn koji e uzeti u obzir kako sadanje zahteve
tako i potencijalne budue pravce razvoja sistema.
Klju u borbi sa kompleksnou softvera jeste modularizacija. Dekompozicijom problema na
manje celine - potprobleme, i reavajui svaku celinu pojedinano, lake se dolazi do
zadovoljavajueg dizajna i implementacije celog sistema. Svaki od prepoznatih potproblema u
sistemu predstavlja jednu funkcionalnost sistema, odnosno jednu dunost (concern) koju sistem
mora da ispuni da bi obavljao svoju funkciju. Prema tome, softverski sistem moemo definisati
kao skup dunosti koje mora da ispuni. Sve dunosti koje sistem mora da zadovolji moemo
podeliti u dve kategorije:
Centralna (core) dunost koja opisuje glavnu funkciju jednog modula i karakteristina je
samo za taj modul.
Isprepletane (crosscutting) dunosti koje opisuju sporedne funkcije sistema prisutne u
mnogobrojnim modulima.
Na primer, u bankarskom sistemu, osnovna dunost sistema jeste da vodi rauna o klijenima i
raunima, izraunava kamate, obavlja transakcije izmedju banaka, itd. Svaku od ovih dunosti
nazivamo centralnim dunostima koje sistem mora da zadovolji. Medjutim, pored ovih, glavnih
dunosti, svaka aplikacija sa poslovnom primenom mora zadovoljiti jo mnogo drugih,
sporednih dunosti, koje se prepliu sa svim centralnim modulima: identifikacija i autorizacija
korisnika, logovanje akcija, keiranje podataka, nadgledanje peformansi sistema, upravljanje
transakcijama nad bazom podataka i mnogo drugih. Provera identiteta korisnika je neophodna u
svakom modulu koji mora da ispuni odreene sigurnosne zahteve, upravljanje transakcijama je
potrebno na svakom mestu u sistemu koji komunicira sa bazom podataka itd. Takve dunosti
sistema nazivamo isprepletane.
AOP je metodologija koja omoguava razdvajanje isprepletanih dunosti sistema uvodei novu
jedinicu apstrakcije aspekt. Koristeci AOP, realizacija svake isprepletane dunosti sistema je
enkapsulirana u aspektu i ne dolazi do sjedinjavanja sa centralnim modulima. Fokus svakog
aspetka je specifina isprepletana dunost, ime se omoguava implementacija centralnih
modula koji nisu vie optereeni ispunjavanjem isprepletanih dunosti i slobodni su da evoluiraju
nezavisno od njih. Aspektni tkalac (weaver), entitet slian kompajleru, je zaduen za kompoziciju
finalnog sistema, kombinujui centralne i isprepletane module, zadovoljavajui sve dunosti
sistema. Taj process se zove tkanje (weaving). Rezultat procesa jeste da AOP uvodi
modularizaciju u isprepletene dunosti i dovodi do arhitekture sistema koja je laka za dizajn,
implementaciju i odravanje.
2. AOP metodologija
2.1 Simptomi isprepletanih dunosti
U uvodu smo uveli pojam centralnih (glavnih) i isprepletanih (sporednih) dunosti koje sistem
mora da zadovolji i realizuje. Slika 2.1 prikazuje realizaciju i interakciju ovih dunosti u jednom
modulu sistema. Ovaj graficki prikaz pokazuje sistem dobijen korienjem danas iroko
prihvaenih tehnika za implementaciju softvera, sistem u kome su raznovrsne dunosti sistema
medjusobno zamrene.
Slika 2.1: Sistem kao kompozicija vie dunosti. Svaki implementacioni modul sadri kd koji
realizuje vie od jedne dunosti sistema.
ist objektno orjentisani pristup implementaciji isprepletanih dunosti sistema dovodi do pojave
dva klasina neeljena simptoma: preplitanje koda (code tangling) i rasipanje koda (code
scaterring).
Preplitanje i rasipanje koda mogu se pojaviti takodje i kao posledica loeg dizajna i/ili
implementacije (npr. kopiranje istog koda na vie mesta). Takvi problemi se, naravno, mogu
razreiti u okvirima OOP. Medjutim, upotrebom OOP za realizaciju isprepletanih dunosti
sistema, problem preplitanja i rasipanja koda je uvek prisutan.
Ilustrujmo ovaj princip kroz deo koda. Primer prikazuje implementaciju modula koji enkapsulira
poslovnu logiku u klasinom OOP stilu.
Primer 2.1
Iako je svaki problem specifian, ovaj primer dobro prikazuje uobiajni problem sa kojim se
suoavaju programeri. I pored toga postoji konceptualna razdvojenost izmedju razliitih dunosti
sistema tokom izrade dizajna, tokom implementacije dolazi do medjusobnog preplitanja vie
dunosti u jednom modulu. Ovakva implementacija ne ispunjava neke od osnovnih principa
dobrog objektno orijentisanog dizajna, izmedju ostalih i Single Responsibility Principle - za
promenu klase nikada ne sme postojati vie od jednog razloga[10], kao i Open/Closed Principle
- softverski entiteti (klase, moduli, funkcije, itd) treba da budu otvoreni za nasledjivanje i zatvoreni
za promenu[11].
I u sluaju dobro dizajniranog sigurnosnog modula koji nudi apstraktan API i sakriva detalje
implementacije, svaki klijentski modul (u ovom primeru modul za rad sa raunima, ATM modul i
modul za rad sa bazom podataka) mora da sadri kd koji poziva sigurnosni API. Taj kd je rasut
po svim modulima koji koriste sigurnosni modul i posledica toga je neenjena povezanost svih
modula kojima treba sigurnosna provera i samog sigurnosnog modula (primer 2.1, linija 07).
Koristei AOP, ni jedan modul nee sadrati pozive za autorizaciju. Slika 2.4 prikazuje
implementaciju iste sigurnosne provere prikazanu i na slici 2.3, samo koristeci AOP. Realizacija
kontrole pristupa u sistemu (implementacija servisa i poziv servisa) sada se nalazi izolovana u
sigurnosnom modulu i sigurnosnom aspektu.
Slika 2.4: Implementacija kontrole pristupa koristeenjem AOP tehnike. Aspekt za kontrolu
pristupa definie take preseka u kojima treba izvriti proveru indentiteta i autorizaciju i poziva
javne metode definisane na modulu za kontrolu pristupa prilikom izvravanja tih taaka preseka.
Klijentski moduli vie ne sadre kd za autorizaciju.
Zahtevi za sigurnosnom proverom u svim modulima su sada realizovani u samo jednom modulu
aspektu za kontrolu pristupa (AuthorizationAspect u primeru 2.3). Sa ovakvom modularizacijom,
svaka promena u logici sigurnosne provere e se reflektovati samo na aspekt za kontrolu
pristupa, potpuno izolujui klijentske module (AccountServiceAOP). Fundamentalna razlika koju
AOP donosi jeste obostrana nezavisnost pojedinanih dunosti sistema i nakon same
implementacije, ne samo u toku dizajna. Implementacija se lako povezuje sa odgovarajuom
dunou sistema koju realizuje, to kao rezultat daje sistem koji je jednostavnije razumeti,
implementairati i menjati.
00 public class AccountServiceAOP implements IAccountService {
01 IUserDao userDao;
02 IAccountDao accountDao;
03
04 public List<Account> getAccountsForUser(User user) {
05 return accountDao.getAccountsForUser(user);
06 }
07 public void removeAccount(User user, Account account) {
08 user.getAccounts().remove(account);
09 userDao.saveOrUpdate(user);
10 }
11 public void saveOrUpdate(User user, Account account) {
12 user.getAccounts().add(account);
13 userDao.saveOrUpdate(user);
14 }
15 }
16
17 public aspect AuthorizationAspect {
18 IAuthorizationService authorizationService;
19 pointcut secureAccess() :
20 execution(* org.matf.icikic.banking.service.AccountServiceAOP.*(..));
21 before(User user, Account account) :
22 secureAccess() && args(user, account) {
24 if (!authorizationService.isAccessAllowed(user, account)) {
25 throw new SecurityException();
26 }
27 }
28 }
Primer 2.3. Implementacija modula za administraciju rauna u bankarskom sistemu koja je u
potpunosti izolovana od kontrole pristupa i AspectJ implementacija aspekta koji e obaviti
sigurnosnu proveru pre svake metode u AccountServiceAOP klasi.
Do sada je bilo rei samo o AOP metodologiji. Vreme je da zaemo malo dublje i predjemo na
AOP implementaciju. Kao i svaka druga metodologija u programiranju, AOP se sastoji iz dva
dela[5]:
Specifikacija jezika - opisuje jezike konstrukcije i definie sintaksu.
Implementacija jezika - zaduena za verifikaciju i prevodjenje koda u izvrivu formu.
Uglavnom realizovano pomou neke vrste kompajlera.
Moe se i dodatno manipulisati nainom umetanja aspekata u klase, u sluaju da elimo pomeriti
proces preplitanja od kompaliranja ka izvravanju. U Java programskom jeziku za takve potrebe
koristiti se specijalni uitava klasa (class loader), koji prvo uitava bajtkod aspekata, a zatim ih
automatski umee u klase prilikom uitavanju klasa.
Opisani pristupi su razliiti u nainu i trenutku umetanja aspekata, ali se svi zasnivaju na
konceptu aspektnog kompajlera. Postoji drugi opte prihvaeni nain implementacije AOP,
zasnovan na korienju dinamiki kreiranih proxy objekata. U ovakvom pristupu svaki objekat u
koji treba umetnuti aspekte je obuhvaen proxy objektom. Na primer, Spring framework
implementira AOP kreirajui proxy objekte u trenutku izvravanja sistema, koji presreu pozive
definisanih metoda i zatim preusmeravaju te pozive ka ciljnim metodama.
Slika 2.6: Proxy objekat koji okruuje ciljni objekat, presree pozive metoda i izvrava dodatnu
logiku pre pozivanja metode na ciljnom objektu.
2.6 AOP terminologija
Kao i veina tehnologija, AOP je formirao sopstveni argon. Pojmovi uvek prisutni u diskusiji o
1
AOP-u jesu take spajanja, taka preseka i savet .
1. Take spajanja (join points) su jedinstveno prepoznatljive take u toku izvravanja
sistema. Primer takvih taka su izvravanje metode, instanciranje objekta, ili bacanje
izuzetaka. Take spajanja su prisutne u svakom sistemu, nisu vezane za AOP.
2. Taka preseka (pointcut) je konstrukcija kojom se odredjuju take spajanja koje
zadovoljavaju odredjeni kriterijum. Na primer, za aspekt za logovanje interesantni su
pozivi svih javnih metoda u sistemu.
3. Savet (advice) je konstrukcija koja menja ponaanje programa. Kada taka preseka
izabere odgovarajue take spajanja na scenu dolazi savet aspekta, koji sadri dodatnu
logiku koja se se umee i modifikuje ponasanje modula. Savet umee dodatno ponaanje
pre, posle ili okruuje selektovanu taku spajanja. Savet je forma dinamikog
preplitanja (dynamic crosscutting) jer utie na ponaanje programa u toku njegovog
izvravanja. Na primer, u implementaciji logovanja, savet je zaduen da zabelei ulazak
u svaku javnu metodu.
4. Pored dinamikog, postoji i statiko preplitanje koje omoguava promenu strukture
samog sistema. Upotrebom medju-tipovne deklaracije (inter-type declaration), mogue
je dodati u definiciju klase novu promentljivu.
5. Aspekt je konstrukcija u kojoj se izraavaju sve prethodno pomenute konstrukcije. Cilj
AOP-a je da postoji modul koji enkapsulira svu isprepletanu logiku, a aspekt je mesto gde
se definise ta logika. Aspekt sadri take preseka, savete i konstrukcije statikog
preplitanja.
Slika 2.7: Funkcionalnost aspekta (savet) se umee u toku izvravanja programa u jednoj ili vie
taaka.
Svaka AOP implementacija mora da sadri model taaka preseka (ine ga take spajanja i take
preseka), jer je to centralna konstrukcija oko koje se sve gradi. Medjutim, ne mora svaka
implementacija da podrava sve ostale delove generikog modela. Kao sto je ve pomenuto
Spring AOP akcenat stavlja na kombinovanje isprepletanih i centralnih dunosti sistema u toku
izvravanja programa i ne podrava statiko preplitanje.
1
Detaljnije o svakom terminu u poglavljima 3.1, 3.2, 3.3, 3.4.
je u nauku o programiranju uveo poznati naunik E.W.Dijkstra[15]). U radu izdatom 1972. David
Parnas je dao predlog za najbolji nain postizanja SoC: modularizacija - proces kreiranja modula
koji sakrivaju svoje odluke medjusobno. OOP je pruilo moan nain za razdvajanje centralnih
dunosti sistema. Medjutim, nije se pokazalo tako dobro kod isprepletanih dunosti. Nekoliko
metodologija se pojavilo kao reenje za modularizaciju isprepletanih dunosti: meta-
programiranje, reflektivno prigramiranje, subjekt orjentisano, adaptivno programiranje, aspektno
orjentisano, itd. Velika zastupljenost AOP-a u razvoju novih aplikacija sa primenom u
svakodnevnom ivotu, pokazuje da je AOP izraslo u najpopularnije reenje.
Veliki deo istraivanja koje je dovelo do pojave AOP-a sprovedeno je u naunim institucijama.
Cristina Lopes i Gregor Kiczales iz Paolo Alto Research Center su jedni od prvih koji su radili na
razvoju AOP-a. Gregor[5] je takodje i zapoeo rad na AspectJ, prvoj implementaciji AOP-a.
Pomenute mane su ipak mala cena koju treba platiti zarad prednosti koje donosi AOP:
Precizno definisane obaveze svakog modula - modul vie nije odgovoran za ispunjavanje
isprepletanih duznosti sistema.
Vii nivo modularizacije - AOP prua mehanizam za izolaciju svih dunosti sistema (ak i
isprepletanih) uz minimalnu medjusobnu vezu. Rezultat je sistem koji sadri manje
dupliranja koda i koji je laki za razumevanje i odravanje.
Laka evolucija sistema - uvodjenje nove funkcionalnosti u sistem se svodi na uvodjenje
novog aspekta i ne zahteva menjanje centralnih modula. Obrnuto, aspektni kompajler e
postojee aspekte umetati u svaki novo-uvedeni centralni modul.
Bolja iskorienost koda - bolja podela dunosti i labava povezanost dovodi do bolje
iskorienosti koda. AOP implementira svaku dunost u posebnom aspektu i svaki modul
je vezan za sistem slabijom vezom nego koristei konvencionalne tehinke. Precizinije
reeno, veza izmedju razliitih modula je prisutna samo u specifikaciji pravila za
kombinovanje isprepletanih dunosti sistema.
3. AspectJ
AspectJ[5] je aspektno-orjentisana ekstenzija programskog jezika Java. Sastoji se od
specifikacije i implementacije programskog jezika. Specifikacija definie sintaksu i semantiku
jezika kojim se pie kd. Implementacija AspectJ-a ukljuuje aspektni tkalac koji moe biti u
obliku kompajlera i linkera. Tkalac proizvodi bajtkod koji je u skladu sa Java specifikacijom
omoguavajui svakoj Java virtuelnoj maini (JVM) da izvrava taj kd.
AspectJ je nastao i razvijao se u poetku kao poseban jezik sa novim rezervisanim reima i
posebnim kompajlerom za prevodjenje tog jezika na bajtkod (tradicionalna sintaksa). Medjutim,
sa pojavom Jave 5 i uvodjenjem anotacija kao sredstvo za izraavanje meta-podataka, razvila se
alternativna sintaksa za izraavanje aspektno orjentisanih konstrukcija (@AspectJ sintaksa).
Dizajn modela taaka preseka AOP sistema omoguava programerima da piu robusne i lako
odrive sisteme ograniavajui pristup samo nekim takama spajanja. Jezik korien u AspectJ-u
za izraavanje taaka preseka je sofisticiran i omoguava selektovanje taaka spajanja na
osnovu strukturnih informacija kao to su tip objekta, ime objekta, argumenti, prisutne anotacije,
ali uzimajuu u obzir i kontrolni tok programa (control flow).
Slika 3.1: Take spajanja u izvravnju programa (poziv i izvravanje metode su najee
koriene take spajanja).
Moemo videti vie taaka spajanja u trenutku poziva debit() metode na AccountService objektu.
Prva taka spajanja jeste poziv debit() metode, a odmah zatim i izvravanje iste metode. U toku
izvravanja nailazimo na nove take spajanja u vidu poziva i izvravanja find() metode na
AccountDao objektu i debit() metode na Account objektu. Poziv i izvravanje metoda nisu jedine
take spajanja, dodeljivanje vrednosti promenljivoj (npr. u toku izvravanja setBalance() metode
na Account objektu) je takodje taka spajanja.
Na konstruktorima
Slino kao u sluaju taaka spajanja na metodama samo to predstavljaju izvrenje i
poziv konstruktora.
Taka preseka se definie korienjem rezervisane rei pointcut. Ime take preseka se dodeljuje
da bi definisana taka mogla da se koristi kasnije u definiciji saveta aspekta. Deo nakon dvotake
je izraz koji selektuje take spajanja koristei tip take preseka i potpis programskih elemenata.
before() : accountOperation() {
telo saveta
}
AspectJ podrava Java logike operatore (!, ||, &&) u svom jeziku za izraavanje taaka preseka
ime omoguava konstrukciju kompleksnih pravila za odabir taaka spajanja kombinujui vie
jednostavnih taaka preseka.
Centralna konstrukcija u definiciji take preseka je potpis programskog elementa. S obzirom da
isprepletane dunosti sistema, po samoj definiciji, proimaju vie modula, jezik za izraavanje
taaka preseka mora pruiti ekonomian nain za izraavanje selekcionih kriterijuma. AspectJ
koristi doker elemente (wildcards) za selekciju elementa koji dele zajednike karateristike:
* jedan ili vie karaktera izuzimajui taku
.. jedan ili vise karatera ukljuujui taku
+ bilo koji podtip datog tipa
U zavisnosti od vrste potpisa programskog elementa ovi znaci dobijaju ua znaenja.
Primer 3.1:
*Account - bilo koji tip ije se ime zavrava sa Account
java.*.Date - tip Date u bilo kom direktnom java podpaketu
java..* - bilo koji tip u java paketu ili bilo kom direktnom ili indirektnom podpaketu
@Entity Account - tip Account sa Entity anotacijom
*<Account> - bilo koji tip iji je parameter Account tip
@Named*Query User+ - tip User ukljuujui njegove podtipove koji su obeleeni anotacijom
ije ime poinje sa Named i zavrava sa Query
@(Secured || Sensitive)* - bilo koji tip koji ima ili @Secured ili @Sensitive anotaciju
2. abloni za izraavanje potpisa metoda i konstruktora
1
Potpis metode, odnosno konstruktora je odredjen imenom, tipom koji vraaju (samo za metode),
tipom na kojem je deklarisana, tipovima argumenta, definisanim nivoom pristupa i prisutnim
anotacijama.
Primer 3.2:
public void Account.set*(*) - bilo koji javni metod definisan na Account tipu, ije
ime poinje sa set, ne vraa rezultat i prima samo jedan argument bilo kog tipa.
* File.*(..) - svaki metod definisan na File tipu, koji prima 0 ili vie argumenta i
vraa rezultat bilo kog tipa.
@Transactional * *(..) - bilo koji metod oznaen sa @Transactional anotacijom.
!public * Account.*(..) - bilo koji ne-javni metod na Account tipu.
* *(..) throws SQLException - svaki metod koji je deklarisan da baca izuzetak tipa
SQLException.
* (@ThreadSafe *).*(..) - svaki metod definisan na tipu koji je oznaen
@ThreadSafe anotacijom.
1
Za razliku od potpisa metoda u Java jeziku, u potpis metode izraenom pomou AspectJ jezika za
definisanje taaka preseka i povratni tip pripada potpisu.
3.2.1.2.2 Indirektne take preseka
Indirektne take preseka odredjuju take spajanja po nekom dodatnom kriterijumu, ne samo
potpisu take spajanja. AspectJ nudi indirektne take preseka koje se zasnivaju na kontrolnom
toku programa, leksikoj strukturi, objektu nad kojim se trenutno izvrava program, argumentima,
anotacijama i uslovnim izrazima.
Slika 3.3: Take preseka na bazi kontrolnog toka programa (cflow, cflowbelow) i take spajanja
koje selektuju na sekvencijalnom UML dijagramu.
posle savet (after advice) izvrava se nakon izvravanja take spajanja. Postoje tri
varijacije u zavisnosti od rezultata izvravanja:
uvek posle (fter finally) izvrava se nakon izvravanja take spajanja
nezavisno od rezultata akcije.
Primer 3.5:
//Savet e se izvravati nakon svake metode u Account
//klasi, nezavisno od rezultata metode
after() : call(* Account.*(..)) {
// loguj povratnu vrednost
}
okruujui savet (around advice) okruuje izvravanje take spajanja. Ovaj savet je
specifian jer ima mogunost da izvri originalnu akciju sa ili bez menjanja konteksta nula
ili vie puta.
Tipina upotreba ovog saveta je da se obavi neka dodatna logika pre izvravanja same
take spajanja, da se prespoji (preskoi) izvravanje take spajanja i primeni neka
alternativna logka, ili obuhvati izvravanje take spajanja sa try/catch blokom,
transakcijom itd Unutar okruujueg saveta mora se pozvati specijalna rezervisana re
proceed() da bi se savetovana taka spajanja izvrila.
Primer 3.10:
void around(Account account, float amount)
: call (void Account.debit(float) throws BalanceExceptin)
&& target(account)
&& args(amount) {
try {
proceed(account, amount);
}catch(BalanceException ex) {
// loguj greku
}
}
Slika 3.4: Take u programskom toku koje aspekti mogu savetovati. Svaki krui na
sekvencijalnom dijagramu predstavlja mogunost umetanja pre i/ili posle saveta, a tok izmedju
dva odgovarajua kruia predstavlja mogunost za okruujui savet.
Primer 3.12:
declare error : callToUnsafeCode(): "This will result in crash";
declare warning : callToDaoLayer(): "Please ensure all calls to
data access layer are performed via service layer";
1
AspectJ podrava 4 vrste asocijacija aspekata: singlton(osnovni), po objektu, po programskom toku i po tipu.
4. Objektno Orjentisani Dizajn (OOD) i AOP
Projektni obrasci opisuju probleme koji se esto sreu u razvoju softvera i nude fleksibilna reenja
tih problema koja se mogu primeniti u mnogim situacijama. Svaki obrazac definiu problem
(opisuje kada se primenjuje obrazac), reenje (opisuje elemente koji ine dizajn, njihove
medjusobne odnose i obaveze) i posledice (rezultati primene obrasca i ustupke uinjene pri
tome)[3]. Kada su indentfikovani projektni obrasci smatrani su remek delom objektno orijentisanih
jezika. Medjutim, sa pojavom radova [7,8] koji su pokazivali da jezik koji se koristi za
implementaciju obrasca utie na njegovu implementaciju, poeli su da se istrauju efekti
aspektno orjentisanih tehnika na implementaciju objektno orjenitsanih obrazaca.
Projektni obrasci dodeljuju uloge (role) svojim uesnicima, primer toga su Subject i Observer u
Observer ili Component, Leaf i Composite u Composite obrascu [3]. Uloge definiu
funkcionalnosti uesnika u kontekstu obrasca. Istraivanjem je pokazan znaajan napredak u
modularnosti implementacija veine projektnih obrazaca korienjem AOP tehinka. Najvei
napredak je postignut u sluajevima gde je isprepletena struktura izmedju uloga i klasa koje
uestvuju u obrascu.
Slika 4.1: Dijagram klasa jednostavne implementacije Observer obrasca. Take, odnosno linija
imaju ulogu subjekta koje obavetavaju o svojoj promeni ekran (koji ima ulogu observera) radi
ponovnog iscrtavanja.
CoordinateObserving.aspectOf().addObserver(S, O);
Privatni metod getObservers() se koristi samo interno da kreira odgovarajuu strukturu podataka
(primer 4.1, linija 7-17). U ovakvoj implementaciji Observer obrasca struktura podataka koja
realizuje mapiranje izmedju subjekta i observera je centralizovano u apstraktnom aspektu. Svaka
instanca obrasca ima svoju individualnu strukturu u kojoj uva veze izmedju subjekta i observera.
Alternativa je decentralizovani pristup u kome svaki uesnik u obrascu uva svoj observere.
4.3.3 Opta logika auriranja
U ponovno upotrebljivom, apstraktnom aspektu, implementiran je samo osnovni koncept logike
auriranja, tj. subjekti mogu da se promene na takav nain da iniciraju auriranje svih njihovih
posmatraa. Ova implementacija ne definie ta ini promenu, niti na koji nain se posmatrai
auriraju. Opta logika auriranja u apstraktnom aspektu se sastoji iz tri dela[4]:
Promene od interesa sistemu se mogu posmatrati kao skup taaka u izvravanju
programa u kojima subjekat treba da aurira svoje posmatrae. Posmatrajui ovu
definiciju u kontekstu AOP-u prirodno je da se takve take odredjuju takama preseka. U
apstraktnom aspektu, znamo samo da postoje promene koje nas zanimaju, ali ne znamo
koje su to promene. Zbog toga je definisana apstraktna taka preseka subjectChange
koju treba konkretizovati u specifinoj instanci pod-aspekta (primer 4.1, linija 25).
U ponovno upotrebljivom delu implementacije takodje znamo da e posmatrai biti
aurirani ali ne moemo predvideti na koji nain e to biti uradjeno. Zbog toga je
definisana apstraktna metoda updateObserver() koja ce biti konkretizovana za svaku
instancu obrasca (primer 4.1, linija 27).
Na kraju, ponovno upotrebljiv aspekt implementira logiku auriranja koristei ve
pomenute apstraktne elemente. Ova logika je sadrana u posle savetu (primer 4.1,
linija 29-33).
Primer 4.2
00 public aspect CoordinateObserver extends ObserverProtocol {
01 declare parents: Point implements Subject;
02 declare parents: Line implements Subject;
03 declare parents: Screen implements Observer;
04
05 protected pointcut subjectChange(Subject s):
06 (call(void Point.setX(int))
07 || call(void Point.setY(int))
08 || call(void Line.setP1(Point))
09 || call(void Line.setP2(Point)) ) && target(s);
10
11 protected void updateObserver(Subject s, Observer o) {
12 ((Screen)o).display("Coordinate change.");
13 }
14 }
Primer D.2.2. Operacije koje zahtevaju sigurnosnu proveru pre izvravanja. Implementacija
operacije ne sadri proveru sigurnosnih pravila aplikacije, ali e potovanje tih pravila nametnuti
SecurityAspect umetanjem definisanog saveta pre izvravanja same operacije.
Kao i u sluaju kontrole pristupa, validacija podataka je enkapsulirana u jednom aspektu koji
selektuje take izvravanja svih metoda u sistemu oznaenih sa @Validation anotacijom (primer
D.3.1, linija 04-05). Unutar saveta koji se umee pre izvravanja validirane metode, refleksijom se
izvlae svi parametri metode i validacija se izvrava nad onim koji su oznaeni
@ValidationConfig anotacijom (primer D.3.1, linija 08-21). U @ValidationConfig anotaciji
definisano je ime validatora koji treba primeniti na dati argument i na osnovu kojeg se sam
validator instancira iz Spring-ovog aplikacionog konteksta. Robustnost celokupnog mehanizama
validacije primenjen u primeru bankarskog sistema, zasniva se na implementaciji generikih
validatora (RequiredValidator i ConditionValidator), Spring konfiguraciji i evaluaciji OGNL (Object-
1
Graph Navigation Language) izraza, ali to prevazilazi okvire ovog poglavlja . U naem sluaju
bitno je pomenuti prisutnost validatora koji proverava da dati parametar postoji (nije null) i
validator rauna koji proverava da je raun aktivan i odredjenog tipa (tekui, tedni, kreditni).
1
Za bolje razumevanje implementiranog mehanizma validacije, pogledati izvorni kod bankarskog sistema
Primer D.3.2. Oznaene metode i argumenti nad kojima treba primeniti validaciju. U prvom
primeru se definie validator koji proverava prisutnost argumenta (user != null), u drugom
definisani validator proverava da li je raun aktivan i da li je tip rauna tekui.
Primer D.4.1. Metode koje zahtevaju izvravanje unutar transakcije. Sama metoda ne sadri kod
za upravljanje transakcijama, ali e Spring AOP umetanjem definisanog AspectJ saveta, odnosno
obmotavanjem metode u proxy objekat obezbediti izvravanje unutar transakcije.
D.5. Logovanje izvrenih operacija
00 @Aspect
01 public class LoggingAspect extends BaseBankingAspect {
02 @Pointcut("execution(* org.matf.icikic.banking.service..*(..))")
03 protected void allServiceMethods() {
04 }
05
06 @Pointcut("execution(* org.matf.icikic.banking.dao..*(..))")
07 protected void allDaoMethods() {
08 }
09
10 @Pointcut("allServiceMethods() || allDaoMethods()")
11 protected void allServiceAndDaoMethods() {
12 }
13
14 @Around("allServiceAndDaoMethods()")
15 public Object log(ProceedingJoinPoint pjp) throws Throwable {
16 Logger logger = LoggerFactory.getLogger(getTypeName(pjp));
17 try {
18 boolean isDebugEnabled = logger.isDebugEnabled();
19 if (isDebugEnabled) {
20 logger.debug(getOperationName(pjp)
21 + "( --> " + getArgs(pjp) + ")");
22 }
23 long start = System.nanoTime();
24 Object ret = pjp.proceed();
25 long end = System.nanoTime();
26 if (isDebugEnabled) {
27 double execTime = (end - start) / 1000;
28 logger.debug(getOperationName(pjp) + "( <-- " +
29 formatString(ret) + ") , execution time: " + execTime+ " ms");
30 }
31 return ret;
32 } catch (Throwable e) {
33 if (logger.isErrorEnabled()) {
34 logger.error(getOperationName(pjp) + "( <-- ) : "
35 + e.getLocalizedMessage(), e);
36 }
37 throw e;
38 }
39 }
40 }
Knjige i lanci
[1] Bauer, C., King, . Java Persistence with Hibernate, Manning Publications, 2005.
[2] Florijn, G., Meijers, M., Winsen, P. van. Tool support for object-oriented patterns. Objavljeno u
Proceedings of ECOOP, 1997.
[3] Gamma, E., Helm, R., Johnson R., Vlissides J. Design Patterns-Elements of Reusable Object-
Oriented Software. Addison-Wesley, 1994.
[4] Hannemann, J., Kiczales, G. Design Pattern Implementation in Java and AspectJ. Objavljeno
th
u Proceedings of the 17 Annual ACM Conference on Object-Oriented Programming, Systems,
Languages, and Applications (OOPSLA), strana 161-73, 2002.
[5] Laddad, R. AspectJ in Action, drugo izdanje. Manning Publications, 2008.
[6] Mapelsden, D., Hosking, J. and Grundy, J. Design Pattern Modelling and Instantiation using
DPML. Objavljeno u Proceeding of TOOLS Pacific, 2002.
[7] Norvig, P. Design Patterns in Dynamic Programming. Objavljeno u Object World, Boston MA,
1996.
[8] Sullivan, G. T. Advanced Programming Language Features for Executable Design Patterns.
MIT Artificial Intelligence Laboratory, 2002.
[9] Walls, C., Breidenbach, R.. Spring in Action, drugo izdanje. Manning Publications, 2008.
Internet resorsi
[10] Martin, Robert C. The Open Closed Principle, 2002. Dostupno na
http://www.objectmentor.com/resources/articles/ocp.pdf.
[11] Martin, Robert C. The Single Responsibility Principle, 2002. Dostupno na
http://www.objectmentor.com/resources/articles/ocp.pdf.
[11] Aspektno orijentisano programiranja http://aosd.net
[12] AspectJ http://www.eclipse.org/aspectj/
[13] Spring framework http://www.springframework.org/
[14] Separation of Concerns http://ctrl-shift-b.blogspot.com/2008/01/art-of-separation-of-
concerns.html
[15] On the role of scientific thought (E.W.Dijsktra)
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD447.html