Aspect Oriented Programming Nedir? — Spring AOP

Mehmet Demircan
3 min readNov 20, 2020

Merhaba arkadaşlar,
Bildiğim kadarıyla sizlere AOP’dan bahsedeceğim,
Ek olarak Spring AOP ile örnek bir proje gerçekleştireceğim.

Cross Cutting Concern Nedir?

Concern, uygulamalarımızın belli bölümlerinde core fonksiyonlarımızın dışında yapı ve kurallar dahilinde gerçekleşen logging, performance, transaction management, security, caching, validation, exception handling gibi sınıflandırdığımız çatıların her biridir. Cross cutting concern denmesinin sebebi uygulamızın istenilen yerlerinde kullanılması ve kullanılırken o bölgeden soyutlanmış yapılar olmasıdır.

Aspect Oriented Programming (AOP) Nedir?

Aspect, uygulamalarımızın cross cutting concern kısımlarını işleyen bir programlama paradigmasıdır ve paradigmanın çıkış noktası concernlere çözüm üretmektir. Bu yapının kullanılma motivasyonu, single responsibility ve don’t repeat yourself gibi prensiplere uygun olmasıdır.

Faydaları nelerdir?
- Uygulamamızın daha esnek olması ve yönetimi kolaylığı,
- Tekrar eden kod düzeninden kurtulma,
- Daha temiz ve anlaşılabilir bir kod,
- Core logic ve concernlerin birbirinden ayrılması.

Günlük hayattan bazı kullanım örnekleri:
Logging → Servisimize gelen request ve response’ların loglanması.
Transaction Management → Ödemenin alınmasından itibaren çalışan kod döngüsünde oluşacan hata sonrası iade işleminin gerçekleştirilmesi.
Performance → Metodların çalışma sürelerinin hesaplanması.
Validation → Atılacak e-mail öncesi kullanıcı e-mail izin kontrolü.

Halen ilginizi çekiyorsa biraz da teknik konuşalım.
Spring’in AOP bağımlılığını pom.xml’ye ekleyerek başlayalım:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Advice Tipleri

@Before: Method devreye girmeden önce çalışır.
@AfterReturning: Method başarılı sonuçlandıktan sonra çalışır.
@AfterThrowing: Methodun exception dönmesi durumunda çalışır.
@After: Returning ve Throwing her iki durumdada çalışır. (finally)
@Around: Method devreye girmeden önce ve metod bittikten sonra çalışır.

Pointcut İfadeleri

Pointcut (kesim noktası) aspectimiz ile neyin eşleşmesi gerektiğini belirler.

target: Metodumuzun çalışması hedeflenen beani ifade eder.
execution: Metodumuzun çalışacağı bölge belirtilir.
@annotation: Hedef anotasyon dahilinde çalışacağı anlamına gelir.

Pointcut ifadelerinin bir çok çalışma yöntemi vardır, kaynaklar bölümünden farklı çalışma yöntemlerini de inceleyebilirsiniz.
Örnek bir Aspect performance log uygulaması:

JoinPoint’i aşağıdaki advice türleriyle kullanın:

@Before, @After, @AfterReturning, @AfterThrowing

ProceedingJoinPoint’i aşağıdaki advice türü ile kullanın:
JoinPoint’ten farkı içindeki .proceed() ile return value yu handle edebiliriz.

@Around

Email’leri get ettiğimiz işlem sonrası konsol loglarımız:

Projemizin kaynak kodlarına ve birkaç örneğe daha buradan ulaşabilirsiniz.
Bildiklerimi olabildiğince anlatmaya çalıştım, umarım faydalı olmuştur.

Kaynaklar

--

--