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.
Uygulama içerisinde herhangi bir bağımlılık oluşturmadan kullanılabilir.
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.
pom.xml dosyamıza aop kullanımı için dependency eklememiz gerekmekte.
Spring Boot uygulamamızda AOP kullanmamız için Application sınıfımızda Aspect kullanımını aktif etmemiz gerekiyor.
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.
AOP kullanımı için belirli advice türleri mevcuttur.
- @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.
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.
Postman üzerinden Service paketimizde bulunan UserServiceImpl içerisindeki saveUser() metodunu tetikleyip ekranda log bilgileri gözükecektir.