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.
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.
<?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…
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
Leave a Reply