Spring AOP 1 - AOP Nedir? Basitçe Spring İle AOP Nasıl Uygulanır?
Merhabalar. Bu ve gelecek bir kaç yazıda Spring Framework’ün AOP uygulama mantığını öğreniyor olacağız.
AOP Nedir?
Geliştirdiğimiz uygulamalarımız içerisinde bir çok layer olabilir ve bu layer’lar da kendi içlerinde modüllere sahip olabilir. Projemiz içerisinde hedeflediğimiz belli bir işlevi yerine getiren fonksiyonalitelere de concern adını veriyoruz. Proje içerisinde bu concern’lerden birisine farklı farklı layer’larda ihtiyaç duyuluyor olabilir. Örneğin yetkilendirme mekanizması proje içerisinde bir çok farklı nokta için başvurulan bir mekanizma olabilir. Keza yine loglama mekanizması da hemen hemen bütün concern’lerin kullanma ihtiyacı duyduğu bir mekanizma (concern). İşte bu şekilde bir çok farklı noktada kullanımına ihtiyaç duyulan concern’lere Cross-Cutting Concern adı verilir.
AOP yani Aspect-Oriented Programming terimi ise işte bu Cross-Cutting Concern’lerin implementasyonunu en iyi seviyede yapmayı amaçlayan bir programlama yaklaşımıdır. Bir projede Cross-Cutting Concern’ler duplicate kodun çokça yer almasına sebep olabilecek yapılardır. AOP ile bu kod tekrarının minimum seviyeye çekilmesi hedeflenir.
AOP Concepts
AOP yaklaşımının kendine ait bir takım kavramları (Concepts) vardır. AOP’u iyi anlayabilmek için bu kavramların da anlaşılması gerekir.
- Joinpoints: Joinpoint aslında programın çalışması sırasında meydana gelen tüm olayları niteler. Örneğin method çağırılması, hata fırlatılması Joinpoint’e birer örnektir.
- Advice: Belirli bir Joinpoint’de alınması gereken aksiyonu tanımlayan kelime bizim için Advice’dır. Birkaç çeşit Advice yapısı bulunur, örneğin before advice’ı ilgili Joinpoint çalıştırılmadan önce devreye girer, after advice’ı ise çalıştırıldıktan sonra devreye girer.
- Pointcuts: Az önce bahsettiğimiz Joinpoint’lerin bir kümesidir. Kullanım amacı ise bir Advice’ın hangi Joinpoint için çalıştırılacağının belirlenmesidir. Yani bir bakıma advice ne zaman çalışsın sorusuna cevap verme görevi vardır.
- Aspects: Aspect dediğimiz kavram advice ve Pointcuts’ı içerisinde barındıran bir sınıftır.
- Weaving: En uygun noktada aspect’lerin uygulama koduna eklenmesi işlemine Weaving denir.
- Target: Bir AOP işlemi ile modifiye edilen ve çalışma akışı bilgisine sahip olan nesnelere Target ismi verilir.
AOP İle Hello World
Şimdi AOP kullanarak bir Hello World uygulaması yapacağız.
Elimizde içerisinde konsola World yazdıran writeMessage metodunu barındıran MessageWriter sınıfımız olsun ve bizim Case’miz de runtime sırasında World olan bu mesajı Hello World’a çevirmek olsun.
writeMessage metodu konsola World yazdıracak olsa da biz AOP ile konsola yazdırılan metnin Hello World olmasını sağlayacağız.
MethodInterceptor interface’ı Spring AOP içerisinde advice implementasyonu için kullanılan standarttır arkadaşlar. İçerisinde implement edilmek üzere bir invoke metodu yer alır ve Joinpoint’de buradaki invoke çağırılır. MessageDecorator sınıfı bizim için bu noktada advice olacaktır çünkü bizim için belirli noktada alınması gereken aksiyon bu sınıfta yer almaktadır.
HelloWorldAOPExample sınıfımız içerisinde maim metodumuz yer alıyor. Main metodu içerisindeki target nesnesi klasik nesne edinme yöntemi ile elde ediliyor. Kodun devam kısmında ProxyFactory sınıfından bir nesne elde ediyoruz ve addAdvice() metodu ile az önce advice’mız olacağından bahsettiğimiz sınıf advice olarak ekliyoruz. addAdvice metoduna parametre olarak MessageDecorator sınıfından bir nesneyi geçirerek advice ekleme işlemimizi tamamlıyoruz. Akabinde pf nesnesi üzerinden setTarget metodunu çağırarak az önce klasik şekilde ürettiğimiz MessageWriter tipinde nesne olan target nesnesini setTarget metoduna parametre olarak veriyoruz. ProxyFactory sınıfından üretilen bir nesne için target zorunlu bir nesnedir arkadaşlar. Eğer setTarget metodunu kullanmadan uygulamayı çalıştırırsak zorunlu alan doldurulmadığı gerekçesi ile Exception alırız.
pf nesnesi üzerinden getProxy metodunu çağırarak ve casting işlemine tabi tutarak MessageWriter nesnesi elde ediyoruz.
Önce target nesnesi üzerinden writeMessage metodunu çağırıyoruz ardından pf.getProxy() üzerinden elde ettiğimiz MessageWriter tipindeki proxy nesnesi üzerinden writeMessage() metodunu çağırıyoruz.
Konsol çıktısı şu şekilde olmakta:
Şimdi burada bir nokta dikkatimizi vermemiz gerekiyor. Advice’ın tanımını yaptığımız nokta örnek olarak before, after gibi örnekler vermiştirk. Fakat burada kullandığımız advice için before, after gibi bir şeyi ne tanımladık ne de ona değindik.
Eğer biz MethodInterceptor’ı implement edip advise olarak o sınıfı geçirirsek bu durumda default olarak bizim iş yapan metodumuz çağırılmadan önce (bizim örneğimizde writeMessage metodu) advise olarak verilen sınıf nesnesi içindeki invoke çağırılır ve işlem yapılır. Bizim örneğimizde de invoke metodu önce çağırılıp konsola Hello yazdırılıyor, invocation.proceed() ile writeMessage metodu çağırılıp World yazdırılıyor ve son olarak konsola ! yazdırılıp işlem tamamlanyor.
Bu yazıda anlatacağım bu kadar arkadaşlar. AOP’a bir giriş yapıp Spring ile basitçe bir örnek yaptık ve bizim iş metodumuz koşulmadan önce başka bir metodun devreye girmesi durumunu görmüş olduk. Gelecek yazıda Spring’teki Advice Tipleri konusuna değineceğiz.
Görüşene kadar sağlıcakla kalın.
Selam ve Sevgilerimle