AspectJ, aspect-oriented programming (AOP) paradigmasını Java programlama diline entegre eden bir dil genişletmesidir. AspectJ, özellikle büyük ve karmaşık yazılımların modülerliğini artırmak, tekrar eden kodları ortadan kaldırmak ve sistem çapında değişiklikleri daha kolay bir şekilde uygulamak amacıyla geliştirilmiştir. Parçalanmış ilgilerin (cross-cutting concerns) yönetimini kolaylaştırır ve Java uygulamalarıyla tamamen uyumludur.
Bir AspectJ programı şu temel unsurlardan oluşur:
Pointcut, programın hangi noktasına müdahale edileceğini belirleyen bir ifadedir. Örneğin:
execution(* com.example.service.*.*(..))
Bu pointcut, com.example.service
paketindeki tüm metod çağrılarını hedefler.
Advice, belirli bir pointcut gerçekleştiğinde çalıştırılacak kod bloğudur. Örneğin:
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod() {
System.out.println("Method çağrılmadan önce loglama yapılıyor.");
}
Aspect, pointcut’lar ve advice’ler içeren birimlerdir. AspectJ kodları genelde şu şekilde yapılandırılır:
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod() {
System.out.println("Method çağrılmadan önce loglama yapılıyor.");
}
@After("execution(* com.example.service.*.*(..))")
public void logAfterMethod() {
System.out.println("Method çağrıldıktan sonra loglama yapılıyor.");
}
}
Bir loglama işlemi yapmak için AspectJ kullanıldığında, tekrar eden kodlar sınıfların içinde bulunmak yerine ayrı bir aspect içinde tanımlanır.
package com.example.service;
public class UserService {
public void createUser(String username) {
System.out.println("Kullanıcı oluşturuluyor: " + username);
}
public void deleteUser(String username) {
System.out.println("Kullanıcı siliniyor: " + username);
}
}
package com.example.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.UserService.*(..))")
public void logBefore() {
System.out.println("Method çağrılmadan önce loglama yapılıyor.");
}
@After("execution(* com.example.service.UserService.*(..))")
public void logAfter() {
System.out.println("Method çağrıldıktan sonra loglama yapılıyor.");
}
}
Çalışma çıktısı:
Method çağrılmadan önce loglama yapılıyor. Kullanıcı oluşturuluyor: JohnDoe Method çağrıldıktan sonra loglama yapılıyor.
AspectJ, Java projelerinde cross-cutting concerns gibi sistem çapında tekrar eden sorunları çözmek için güçlü bir araçtır. Kod modülerliği sağlama konusundaki başarısı, onu karmaşık projelerde loglama, güvenlik, ve hata izleme gibi kritik alanlarda tercih edilen bir çözüm haline getirmiştir. AspectJ’yi öğrenmek ve uygulamak, özellikle büyük ölçekli yazılımlarda, kodun sürdürülebilirliğini artırır ve bakımını kolaylaştırır.