Spring AOP (Aspect-Oriented Programming) একটি শক্তিশালী প্রোগ্রামিং কৌশল যা cross-cutting concerns (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট) আলাদা করে রাখার মাধ্যমে মূল ব্যবসায়িক লজিক থেকে পৃথক করতে সহায়তা করে। Spring AOP তে Advice হলো সেই কোড যা Pointcut এর মাধ্যমে নির্ধারিত মেথডে কার্যকর হয়।
এখানে আমরা @AfterReturning এবং @AfterThrowing Advice নিয়ে আলোচনা করবো, যা একটি মেথড সাফল্যের সাথে সম্পন্ন হলে এবং ব্যতিক্রম ঘটলে কার্যকর হয়।
1. @AfterReturning Advice
@AfterReturning Advice তখন কার্যকর হয় যখন কোনো মেথড সাফল্যের সাথে সম্পন্ন হয় এবং তার রিটার্ন ভ্যালু থাকে। এটি মূলত রিটার্ন ভ্যালুর পরবর্তী পর্যায়ে কাজ করে এবং এই রিটার্ন ভ্যালুকে পরিবর্তন (modify) করতে পারে। এটি কোনো ব্যতিক্রম ছাড়া সফলভাবে মেথড সম্পন্ন হলে কার্যকর হয়।
@AfterReturning এর ব্যবহার
ধরা যাক, একটি সিম্পল সিস্টেম যেখানে একটি EmployeeService ক্লাস একটি getEmployeeById মেথড ব্যবহার করে। আমাদের লক্ষ্য হবে, মেথডটি সফলভাবে সম্পন্ন হলে কিছু লগিং করা এবং মেথডের রিটার্ন ভ্যালু পরিবর্তন করা।
উদাহরণ:
package com.example.demo;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class EmployeeLoggingAspect {
// @AfterReturning advice: এটি সেই মেথডের রিটার্ন ভ্যালু প্রাপ্ত হওয়ার পর কার্যকর হবে
@AfterReturning(
pointcut = "execution(* com.example.demo.service.EmployeeService.getEmployeeById(..))",
returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method executed successfully and returned: " + result);
}
}
এখানে, @AfterReturning advice মেথডের রিটার্ন ভ্যালু (result) প্রাপ্ত হওয়ার পর কার্যকর হবে এবং আমরা তার সাথে একটি লগ মেসেজ প্রিন্ট করব।
EmployeeService ক্লাস:
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
public String getEmployeeById(int id) {
// সাধারণত, ডাটাবেস বা অন্য সোর্স থেকে ডেটা পাওয়া যাবে, এখানে সিম্পল স্ট্যাটিক ডেটা
if (id == 1) {
return "John Doe";
}
return "Employee not found";
}
}
এখানে, getEmployeeById মেথড একটি স্ট্যাটিক রিটার্ন ভ্যালু দেয়। যখন মেথডটি সফলভাবে কাজ করবে, তখন @AfterReturning অ্যাডভাইসটি কার্যকর হবে এবং রিটার্ন ভ্যালু প্রদর্শন করবে।
2. @AfterThrowing Advice
@AfterThrowing Advice তখন কার্যকর হয় যখন কোনো মেথডে ব্যতিক্রম (Exception) ঘটে। এটি ব্যতিক্রম হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয় এবং ব্যতিক্রম ঘটলে অ্যাডভাইস কার্যকর হয়। এর মাধ্যমে আপনি ব্যতিক্রম ঘটার পর লগিং বা অন্যান্য এক্সট্রা একশন নিতে পারেন।
@AfterThrowing এর ব্যবহার
এখানে আমরা একটি EmployeeService তৈরি করবো যেটি যখন নির্দিষ্ট id এর জন্য কর্মচারী খুঁজে পাবে না, তখন একটি EmployeeNotFoundException ছুঁড়ে দিবে। @AfterThrowing advice ব্যবহার করে আমরা যখন ব্যতিক্রমটি ঘটবে, তখন সেই সম্পর্কিত তথ্য লগ করব।
উদাহরণ:
package com.example.demo;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class EmployeeLoggingAspect {
// @AfterThrowing advice: এটি মেথডে ব্যতিক্রম ঘটলে কার্যকর হবে
@AfterThrowing(
pointcut = "execution(* com.example.demo.service.EmployeeService.getEmployeeById(..))",
throwing = "exception")
public void logAfterThrowing(Exception exception) {
System.out.println("Exception occurred: " + exception.getMessage());
}
}
এখানে, @AfterThrowing advice getEmployeeById মেথডে ব্যতিক্রম ঘটলে কার্যকর হবে এবং ব্যতিক্রমের বার্তা লগ করবে।
EmployeeService ক্লাস:
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
public String getEmployeeById(int id) throws EmployeeNotFoundException {
if (id == 1) {
return "John Doe";
}
// Throwing exception if employee not found
throw new EmployeeNotFoundException("Employee with id " + id + " not found");
}
}
এখানে, getEmployeeById মেথডে যদি id 1 না হয়, তবে EmployeeNotFoundException তৈরি হবে এবং @AfterThrowing অ্যাডভাইসটি কার্যকর হবে।
EmployeeNotFoundException ক্লাস:
package com.example.demo.exception;
public class EmployeeNotFoundException extends Exception {
public EmployeeNotFoundException(String message) {
super(message);
}
}
AfterReturning এবং AfterThrowing এর মধ্যে পার্থক্য
- @AfterReturning: এটি শুধুমাত্র মেথডটি সফলভাবে সম্পন্ন হলে কার্যকর হয় এবং এটি মেথডের রিটার্ন ভ্যালু পর্যালোচনা করতে পারে।
- @AfterThrowing: এটি শুধুমাত্র মেথডে ব্যতিক্রম ঘটলে কার্যকর হয় এবং আপনি ব্যতিক্রমের তথ্য পেতে পারেন।
Spring AOP তে AfterReturning এবং AfterThrowing এর প্রয়োজনীয়তা
- Error Handling: @AfterThrowing অ্যাডভাইসটি ব্যতিক্রম ব্যবস্থাপনা (exception handling) সহজ করে তোলে, বিশেষ করে যখন আপনি ব্যতিক্রমের পর অ্যাকশন নিতে চান (যেমন ব্যতিক্রমের লগিং, মেইল পাঠানো, বা ট্রানজেকশন রোলব্যাক)।
- Logging: @AfterReturning অ্যাডভাইসটি সফল মেথড এক্সিকিউশন এবং রিটার্ন ভ্যালুর জন্য লগিং করতে ব্যবহৃত হতে পারে, যার মাধ্যমে আপনি মেথডের কার্যকারিতা পর্যবেক্ষণ করতে পারেন।
- Business Logic Separation: AOP (Aspect-Oriented Programming) ব্যবহার করে, আপনি ক্রস-কাটিং কনসার্ন যেমন লগিং, সিকিউরিটি, বা ব্যতিক্রম হ্যান্ডলিং মূল ব্যবসায়িক লজিক থেকে আলাদা রাখতে পারেন, যা কোডের মডুলারিটি এবং রিইউজেবিলিটি বৃদ্ধি করে।
সারাংশ
@AfterReturning এবং @AfterThrowing হল Spring AOP এর দুটি গুরুত্বপূর্ণ অ্যাডভাইস যা আপনাকে মেথডের সফল এক্সিকিউশন এবং ব্যতিক্রম ঘটলে কার্যকর কোড কার্যকর করতে সাহায্য করে। @AfterReturning অ্যাডভাইসটি মেথড সাফল্যের সাথে শেষ হলে রিটার্ন ভ্যালু প্রাপ্ত হওয়ার পর কার্যকর হয় এবং @AfterThrowing অ্যাডভাইসটি তখন কার্যকর হয় যখন মেথডে কোনো ব্যতিক্রম ঘটে। এই দুটি অ্যাডভাইস ব্যবহার করে আপনি কার্যকরী লগিং, সিকিউরিটি এবং ব্যতিক্রম ব্যবস্থাপনা করতে পারেন।
Read more