Aspect-Oriented Programming (AOP), logging, transaction management ve güvenlik gibi birçok alana yayılan kesme noktalarını modüler hale getiren bir yaklaşımdır. Bu kılavuzda, Spring Boot kullanarak AOP uygulaması yapmayı Java ve Kotlin ile göstereceğiz.
Yazan
Şuayb Şimşek
Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.
Yeni yazılar yayınlandığında pratik backend ve fullstack notlarını al.
Sosyal
🌟 Neden AOP Kullanmalısınız?
AOP, bir uygulamanın birden fazla bölümünü etkileyen logging veya güvenlik gibi konuları tekrar kullanılabilir aspect'ler haline getirmek için kullanılır. Bu yöntem daha temiz kod, geliştirilmiş bakım kolaylığı ve azaltılmış kod tekrarı sağlar.
Method çalışma detaylarını loglamak için bir aspect tanımlayın.
🛠️ Adım 4: Bir Controller Oluşturun
Servis methodlarını bir REST controller üzerinden sunun.
▶️ Uygulamayı Çalıştırma
Aşağıdaki komutlarla uygulamayı çalıştırın:
Spring Boot (Java/Kotlin):
Kurulumun doğru çalıştığını doğrulamak için uygulamayı tercih ettiğiniz dil yığınıyla başlatın.
BASH
./mvnw spring-boot:run
API'ye şu adresten erişebilirsiniz: http://localhost:8080/api/users.
🧪 API'yi Test Edin
API'yi aşağıdaki cURL komutları ile test edebilirsiniz:
Tüm kullanıcıları getir:
BASH
curl -X GET http://localhost:8080/api/users
Bir ID'ye göre kullanıcı getir:
BASH
curl -X GET http://localhost:8080/api/users/1
🏁 Sonuç
Artık Aspect-Oriented Programming için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.
Servis
JAVAUserService.java
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserById(String id) {
return "ID'ye sahip kullanıcı: " + id;
}
public String getAllUsers() {
return "Tüm kullanıcılar alınıyor.";
}
}
Servis
KOTLINUserService.kt
package com.example.demo.service
import org.springframework.stereotype.Service
@Service
class UserService {
fun getUserById(id: String): String {
return "ID'ye sahip kullanıcı: $id"
}
fun getAllUsers(): String {
return "Tüm kullanıcılar alınıyor."
}
}
Aspect
JAVALoggingAspect.java
package com.example.demo.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Before("execution(* com.example.demo.service.UserService.*(..))")
public void logBefore() {
logger.info("Method çalıştırılmaya başlandı.");
}
}
Aspect
KOTLINLoggingAspect.kt
package com.example.demo.aspect
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
@Aspect
@Component
class LoggingAspect {
private val logger = LoggerFactory.getLogger(LoggingAspect::class.java)
@Before("execution(* com.example.demo.service.UserService.*(..))")
fun logBefore() {
logger.info("Yöntem çalıştırılmaya başlandı.")
}
}
Controller
JAVAUserController.java
package com.example.demo.controller;
import com.example.demo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public String getUserById(@PathVariable String id) {
return userService.getUserById(id);
}
@GetMapping
public String getAllUsers() {
return userService.getAllUsers();
}
}
Controller
KOTLINUserController.kt
package com.example.demo.controller
import com.example.demo.service.UserService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/users")
class UserController(
private val userService: UserService
) {
@GetMapping("/{id}")
fun getUserById(@PathVariable id: String): String = userService.getUserById(id)
@GetMapping
fun getAllUsers(): String = userService.getAllUsers()
}