/Spring-Boot-AOP

AOP using for Spring Boot Project

Primary LanguageJava

Cross Cutting Concerns Nedir?

Oluşturulan projenin belirli kurallar içerisinde uygulanan logging, security, caching, validation, exception handling, performans, transaction management gibi belirlenen; uygulamadan soyut yapıların her biridir.

image

Uygulama içerisinde herhangi bir bağımlılık oluşturmadan kullanılabilir.

Aspect Oriented Programming (AOP) Nedir?

Yukarıda belirtilen Cross Cutting Concern kısımlarının kullanıldığı, okunabilirliği yüksek, kod tekrarından kaçınmayı hedefleyen bir programlama paradigmasıdır. Uygulamanın daha esnek hale getirilmesi, scaling desteklemesi, kolay yönetilebilmesi hedeflediği amaçlar arasındadır.

AOP kullanarak Spring Boot proje Oluşturulması

pom.xml dosyamıza aop kullanımı için dependency eklememiz gerekmekte.

image

Spring Boot uygulamamızda AOP kullanmamız için Application sınıfımızda Aspect kullanımını aktif etmemiz gerekiyor.

image

Aspects paketi altında AspectService sınıfını oluşturduk. @Aspect anotasyonu ile uygulamamıza bu sınıfın aspect kullanımı için düzenlenmesini ve bir Spring Bean olarak Spring'in görebilmesi içinde @Component anotasyonları ile belirtiyoruz. Logging için de Slf4j anotasyonunu log bilgilerini ekranda göstermek için aynı sınıfa ekledik.

image

AOP kullanımı için belirli advice türleri mevcuttur.

image

  • @Before : Belirtilen metot çalışmadan önce çalışacak olan kod bloğudur.
  • @AfterThrowing : Belirtilen metodun exception dönmesi durumunda çalışacak olan metotdur.
  • @AfterReturning : Belirtilen metot başarılı şekilde çalıştıktan sonra çalışacak olan metotdur.
  • @After : Belirtilen metot çalıştıktan sonra çalışacak olan kod bloğudur.
  • @Around : Belirtilen metodun öncesinde ve sonrasında çalışacak olan kod bloğudur.

Around dışındaki advice türlerinin JoinPoint ile kullanımı önerilmektedir. Around ise ProcedingJoinPoint ile kullanımı önerilir. Biz uygulamamızda ikisini birden kullandık.

JoinPoint sınıfını kullanarak @Before advice ını kullandık. İçerisinde belirtilen value ise çalışması gereken sınıf veya sınıfları düzenlemek için kullandık. Sırasıyla paket adı, sınıf adı, ve metot adı belirtilir. Eğer spesifik bir yer belirtilmesi istenmiyorsa ilgili yerlere * işareti konulur.

image

Pointcut kullanarak @Around metodunun nerede çalışması gerektiğini belirttik. ObjectMapper sınıfı üzerinden nesne üretip JSON formatında logging kullanarak ekranda göstermek için info() metodunu kullandık.

image

Postman üzerinden Service paketimizde bulunan UserServiceImpl içerisindeki saveUser() metodunu tetikleyip ekranda log bilgileri gözükecektir.

image