Before এবং After Advice

স্প্রিং এওপি (Spring AOP) - Java Technologies

447

Spring AOP (Aspect-Oriented Programming) একটি শক্তিশালী প্যাটার্ন, যা ক্রস-কাটিং কনসার্ন (Cross-Cutting Concerns) যেমন লোগিং, ট্রান্সঅ্যাকশন ম্যানেজমেন্ট, সিকিউরিটি ইত্যাদি আলাদা করে পরিচালনা করার সুবিধা প্রদান করে। Spring AOP এর মাধ্যমে, আপনি Advice (অর্থাৎ, বিশেষ কাজ বা লজিক) বিভিন্ন পয়েন্টে (Join Points) প্রয়োগ করতে পারেন, যেখানে এগুলো মেথডের আগে বা পরে কার্যকর হতে পারে। এইসব কাজের মধ্যে Before Advice এবং After Advice অন্যতম।

Before Advice এবং After Advice হল Spring AOP এর দুটি গুরুত্বপূর্ণ ধরণ, যা Join Points এর পূর্বে বা পরবর্তী সময়ে কার্যকর হয়। এই আডভাইসগুলি বিভিন্ন ক্রস-কাটিং কনসার্ন কার্যকর করতে সহায়তা করে, যেমন লগিং, নিরাপত্তা চেক, পারফরম্যান্স মেট্রিক্স এবং আরও অনেক কিছু।


1. Before Advice

Before Advice হল সেই ধরনের Advice যা মেথডটি রান হওয়ার আগে কার্যকর হয়। এই Advice এর মাধ্যমে, আপনি মেথড কল হওয়ার আগেই কিছু কাজ করতে পারেন, যেমন লগিং, অ্যাক্সেস কন্ট্রোল, বা ইনপুট যাচাই (input validation)।

1.1 Before Advice এর উদাহরণ

ধরা যাক, আমাদের একটি সার্ভিস ক্লাস রয়েছে এবং আমরা চাই যে, যখনই মেথডটি কল হবে, তার আগে কিছু লগিং কাজ করা হোক।

1.1.1 Aspect ক্লাসে Before Advice ইমপ্লিমেন্টেশন

package com.example.demo.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // @Before annotation indicates that this method will run before the target method is executed
    @Before("execution(* com.example.demo.service.UserService.*(..))")
    public void beforeMethodExecution() {
        System.out.println("Before method execution - LoggingAspect");
    }
}

এখানে:

  • @Before অ্যানোটেশনটি নির্দেশ করে যে এই মেথডটি টার্গেট মেথডের আগে কার্যকর হবে।
  • execution(* com.example.demo.service.UserService.*(..)): এই এক্সপ্রেশনটি নির্দেশ করে যে UserService ক্লাসের সমস্ত মেথডের জন্য AOP অ্যাপ্লাই হবে।

1.1.2 Service ক্লাস (Target Class)

package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void createUser(String userName) {
        System.out.println("User " + userName + " created successfully.");
    }

    public void deleteUser(String userName) {
        System.out.println("User " + userName + " deleted successfully.");
    }
}

1.1.3 Application ক্লাস

package com.example.demo;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        userService.createUser("John");
        userService.deleteUser("John");
    }
}

এখানে, @Before অ্যানোটেশনটি LoggingAspect ক্লাসের beforeMethodExecution() মেথডকে UserService ক্লাসের সমস্ত মেথডের আগে কল করবে।

1.2 আউটপুট

Before method execution - LoggingAspect
User John created successfully.
Before method execution - LoggingAspect
User John deleted successfully.

এখানে, Before Advice কার্যকর হওয়ার আগে UserService এর createUser() এবং deleteUser() মেথডগুলো রান হয়েছে।


2. After Advice

After Advice হল সেই ধরনের Advice যা টার্গেট মেথড রান হওয়ার পরে কার্যকর হয়। এটি ব্যবহৃত হয় যখন আপনি মেথডের শেষে কিছু কাজ সম্পন্ন করতে চান, যেমন লোগিং, সিস্টেম পরিষ্কার করা, বা পরবর্তী পদক্ষেপের জন্য প্রস্তুতি নেয়া।

2.1 After Advice এর উদাহরণ

ধরা যাক, আমরা চাই UserService এর মেথডের পর কিছু লগিং কার্যকর করা হোক।

2.1.1 Aspect ক্লাসে After Advice ইমপ্লিমেন্টেশন

package com.example.demo.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // @After annotation indicates that this method will run after the target method is executed
    @After("execution(* com.example.demo.service.UserService.*(..))")
    public void afterMethodExecution() {
        System.out.println("After method execution - LoggingAspect");
    }
}

এখানে:

  • @After অ্যানোটেশনটি নির্দেশ করে যে এই মেথডটি টার্গেট মেথডের পর কার্যকর হবে।
  • execution(* com.example.demo.service.UserService.*(..)): এই এক্সপ্রেশনটি নির্দেশ করে যে UserService ক্লাসের সমস্ত মেথডের জন্য AOP অ্যাপ্লাই হবে।

2.1.2 Service ক্লাস (Target Class)

package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void createUser(String userName) {
        System.out.println("User " + userName + " created successfully.");
    }

    public void deleteUser(String userName) {
        System.out.println("User " + userName + " deleted successfully.");
    }
}

2.1.3 Application ক্লাস

package com.example.demo;

import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        userService.createUser("John");
        userService.deleteUser("John");
    }
}

2.2 আউটপুট

User John created successfully.
After method execution - LoggingAspect
User John deleted successfully.
After method execution - LoggingAspect

এখানে, After Advice কার্যকর হওয়ার পরে UserService এর createUser() এবং deleteUser() মেথডগুলো শেষ হয়েছে।


3. Before এবং After Advice এর পার্থক্য

  • Before Advice: এটি টার্গেট মেথডের রান হওয়ার আগে কার্যকর হয়। সাধারণত ইনপুট যাচাই, লোগিং, বা নিরাপত্তা চেক করতে ব্যবহৃত হয়।
  • After Advice: এটি টার্গেট মেথডের পর কার্যকর হয়। এটি সাধারণত লোগিং, ট্রান্সঅ্যাকশন ক্লিয়ারিং, অথবা আউটপুট মনিটরিংয়ের জন্য ব্যবহৃত হয়।

4. সারাংশ

Spring AOP (Aspect-Oriented Programming) এর মাধ্যমে আপনি Before এবং After Advice ব্যবহার করে ব্যাচ প্রসেসিং, নিরাপত্তা, লোগিং, এবং অন্যান্য ক্রস-কাটিং কনসার্ন কার্যকর করতে পারেন। Before Advice মেথডের আগে কার্যকর হয় এবং After Advice মেথডের পর কার্যকর হয়। এই AOP ফিচারগুলি কোডের পুনঃব্যবহারযোগ্যতা, রিডেবিলিটি এবং মডুলারিটি বাড়াতে সহায়তা করে।

Content added By

Before Advice কি?

Before Advice হলো স্প্রিং AOP এর একটি ধরনের অ্যাডভাইস যা নির্দিষ্ট Join Point-এর আগে কার্যকরী হয়। Before Advice ব্যবহৃত হয় যখন আপনি কোনো মেথডের চালু হওয়ার আগে কিছু কার্যকলাপ করতে চান, যেমন লগিং, সিকিউরিটি চেকিং বা ট্রানজেকশন ম্যানেজমেন্ট। এটি একটি কার্যকরী উপায় যা আপনার কোডের মূল ব্যবসায়িক লজিকের আগে পূর্বশর্ত যাচাই বা অতিরিক্ত কার্যকলাপ করতে সাহায্য করে।

স্প্রিং AOP-তে @Before অ্যানোটেশন ব্যবহার করে Before Advice কনফিগার করা হয়, যা মেথড কল হওয়ার আগে নির্বাহিত হয়।


@Before Annotation এর মাধ্যমে Before Advice কনফিগার করা

স্প্রিং AOP-তে @Before অ্যানোটেশন ব্যবহার করে আপনি Before Advice কনফিগার করতে পারেন। @Before অ্যানোটেশনটি @Aspect ক্লাসে ব্যবহৃত হয় এবং এটি এক্সিকিউশনের আগে একটি নির্দিষ্ট ক্রস-কাটিং কনসার্ন (যেমন লগিং, নিরাপত্তা চেক, ইত্যাদি) পরিচালনা করার জন্য কাজ করে।

স্প্রিং AOP এ @Before অ্যানোটেশন ব্যবহার করার সাধারণ প্রক্রিয়া:

  1. অ্যাসপেক্ট তৈরি করা - @Aspect অ্যানোটেশন ব্যবহার করে একটি ক্লাস তৈরি করতে হবে।
  2. Before Advice সংজ্ঞায়িত করা - @Before অ্যানোটেশন ব্যবহার করে যে মেথডটি কল হওয়ার আগে কার্যকরী হবে তা নির্ধারণ করতে হবে।
  3. পয়েন্টকাট এক্সপ্রেশন ব্যবহার করা - কোন Join Point (যেমন মেথড কল) এ Before Advice কার্যকরী হবে তা নির্দিষ্ট করতে execution এক্সপ্রেশন ব্যবহার করতে হবে।

উদাহরণ: @Before Annotation দিয়ে Before Advice কনফিগার করা

ধরা যাক, আমরা একটি সার্ভিস ক্লাস তৈরি করতে যাচ্ছি, যেখানে কিছু মেথডে লগিং করতে চাই। এই লগিং কাজটি মেথড কল হওয়ার আগে হবে।

  1. Step 1: Create the Aspect Class with @Before Advice
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // Before advice
    @Before("execution(* com.example.service.*.*(..))") // Define pointcut expression
    public void logBefore() {
        System.out.println("A method is about to execute");
    }
}

এখানে:

  • @Aspect অ্যানোটেশন দ্বারা এই ক্লাসটি একটি অ্যাসপেক্ট হিসেবে চিহ্নিত করা হয়েছে।
  • @Before অ্যানোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে স্প্রিং জানিয়ে দেয় যে এই logBefore() মেথডটি execution(* com.example.service.*.*(..)) এই পয়েন্টকাট এক্সপ্রেশনের সাথে মিলিত হলে কার্যকরী হবে।
    • execution(* com.example.service.*.*(..)) পয়েন্টকাট এক্সপ্রেশন দ্বারা com.example.service প্যাকেজের সমস্ত মেথডের আগে logBefore() চালানো হবে।
  1. Step 2: Service Class Implementation
package com.example.service;

import org.springframework.stereotype.Service;

@Service
public class MyService {

    public void performTask() {
        System.out.println("Performing task in MyService.");
    }

    public void anotherTask() {
        System.out.println("Performing another task in MyService.");
    }
}

এখানে:

  • MyService ক্লাসে দুটি মেথড performTask() এবং anotherTask() আছে।
  • স্প্রিং AOP এর মাধ্যমে, LoggingAspect ক্লাসের logBefore() মেথডটি এই মেথডগুলির আগে কল হবে, এবং লগ মেসেজ প্রদর্শন করবে।
  1. Step 3: Spring Boot Configuration

স্প্রিং AOP কার্যকর করতে আপনাকে @EnableAspectJAutoProxy অ্যানোটেশন ব্যবহার করতে হবে স্প্রিং কনফিগারেশন ক্লাসে।

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy // Enables AOP proxying in Spring
public class AppConfig {
}

এখানে:

  • @EnableAspectJAutoProxy স্প্রিং AOP-কে সক্ষম করে এবং অ্যাসপেক্ট প্রক্রিয়াকরণ নিশ্চিত করে।
  1. Step 4: Testing the Setup

আপনার SpringBootApplication বা টেস্ট ক্লাসে MyService ক্লাসটি কল করুন এবং Before Advice দেখতে পাবেন।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringAopApplication implements CommandLineRunner {

    @Autowired
    private MyService myService;

    public static void main(String[] args) {
        SpringApplication.run(SpringAopApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        myService.performTask();
        myService.anotherTask();
    }
}

এখানে:

  • performTask() এবং anotherTask() মেথড কল করার আগে logBefore() মেথডটি চালু হবে এবং লগ মেসেজ দেখাবে।

আউটপুট:

A method is about to execute
Performing task in MyService.
A method is about to execute
Performing another task in MyService.

@Before Annotation এর কিছু গুরুত্বপূর্ণ দিক

  • Pointcut Expression: @Before অ্যানোটেশনটি পয়েন্টকাট এক্সপ্রেশন ব্যবহার করে কনফিগার করা হয়। এটি মেথডের সিগনেচার (যেমন মেথড নাম, প্যারামিটার ইত্যাদি) দ্বারা নির্ধারণ করা হয়।
  • No Return Value: Before Advice মেথডের জন্য কোনো রিটার্ন ভ্যালু নেই, কারণ এটি শুধুমাত্র মেথড কল হওয়ার আগে কার্যকরী হয় এবং প্রোগ্রামের স্টেটকে পরিবর্তন করতে ব্যবহৃত হয় না।
  • Exception Handling: @Before অ্যানোটেশনের সাথে এক্সসেপশন হ্যান্ডলিং সমর্থিত নয়। তবে, মেথডের মধ্যে আপনি try-catch ব্যবহার করে এক্সসেপশন হ্যান্ডল করতে পারেন।

সারাংশ

@Before অ্যানোটেশন ব্যবহার করে স্প্রিং AOP-তে Before Advice কনফিগার করা হয়, যার মাধ্যমে একটি নির্দিষ্ট Join Point (যেমন মেথড কল) হওয়ার আগে কিছু কার্যকলাপ সম্পাদন করা সম্ভব হয়। এটি প্রোগ্রামিংয়ের ক্রস-কাটিং কনসার্ন যেমন লগিং, ট্রানজেকশন ম্যানেজমেন্ট বা সিকিউরিটি চেকিং বাস্তবায়ন করতে ব্যবহৃত হয়। AOP-এর মাধ্যমে কোডের ভেতরে সুনির্দিষ্ট কার্যকলাপগুলি অন্তর্ভুক্ত করা যায় যা মূল লজিকের বাইরে থাকে, ফলে কোড আরও পরিষ্কার, রক্ষণাবেক্ষণযোগ্য এবং পুনঃব্যবহারযোগ্য হয়।

Content added By

Spring AOP (Aspect-Oriented Programming) এ After Advice একটি গুরুত্বপূর্ণ উপাদান যা কোনো মেথডের এক্সিকিউশন শেষে কার্যকর হয়। যখন কোনো মেথড সম্পূর্ণভাবে রান হয়ে যায় (অর্থাৎ, সফলভাবে শেষ হয় বা কোনো এক্সেপশন ঘটলে), তখন @After অ্যনোটেশন ব্যবহার করে আপনি একটি নির্দিষ্ট অ্যাকশন বা কার্যকলাপ সম্পাদন করতে পারেন।

@After অ্যনোটেশনটি Advice হিসেবে কাজ করে এবং এটি Join Point এর পরে কার্যকর হয়। এটি সফলভাবে মেথড সম্পন্ন হওয়ার পর বা ব্যতিক্রমের (exception) পরেও কাজ করে। এটির মাধ্যমে আমরা মেথডের পরে লগিং, ট্রানজেকশন রোলব্যাক, বা অন্যান্য পরবর্তী কাজগুলি পরিচালনা করতে পারি।


@After Annotation এর ব্যবহার

@After অ্যনোটেশনটি স্প্রিং এওপি এ একটি অ্যাডভাইস (Advice) তৈরি করার জন্য ব্যবহৃত হয়। এটি একটি Join Point (যেমন মেথড কল) এর পর কার্যকর হয়, আর মেথডের এক্সিকিউশন শেষে আপনাকে একটি নির্দিষ্ট কাজ করতে সহায়তা করে।

উদাহরণ: @After Annotation ব্যবহার করে After Advice তৈরি করা

আমরা একটি উদাহরণ তৈরি করব, যেখানে আমরা একটি Service ক্লাসের মেথডে After Advice প্রয়োগ করব। আমাদের উদাহরণটি একটি UserService ক্লাসের একটি মেথডের পর লগিং করবে।

Step 1: Service ক্লাস তৈরি করা

এখানে একটি UserService ক্লাস তৈরি করা হচ্ছে, যার মধ্যে একটি getUserInfo() মেথড আছে। এই মেথডটি একটি ইউজারের তথ্য রিটার্ন করবে।

package com.example.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getUserInfo(int userId) {
        // Simulate user information retrieval
        System.out.println("Fetching user info for user ID: " + userId);
        return "User Info: [User ID: " + userId + ", Name: John Doe]";
    }
}

Step 2: Aspect ক্লাস তৈরি করা

এখানে আমরা একটি LoggingAspect ক্লাস তৈরি করব, যেখানে @After অ্যনোটেশন ব্যবহার করা হবে। এই অ্যাডভাইসটি getUserInfo() মেথডের এক্সিকিউশন শেষে কার্যকর হবে এবং একটি লগ বার্তা প্রিন্ট করবে।

package com.example.aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @After("execution(* com.example.service.UserService.getUserInfo(..))")
    public void logAfterMethod() {
        System.out.println("After method execution - Logging after UserInfo retrieval.");
    }
}

এখানে:

  • @Aspect: এটি এই ক্লাসটিকে একটি Aspect হিসেবে চিহ্নিত করে।
  • @After: এটি getUserInfo() মেথডের এক্সিকিউশনের পরে কার্যকর হবে।
  • *execution( com.example.service.UserService.getUserInfo(..))**: এটি একটি Pointcut Expression যা getUserInfo() মেথডের কল ধরবে এবং After Advice কার্যকর করবে।

Step 3: Spring Configuration

এখন, Spring Boot অ্যাপ্লিকেশনটিকে কনফিগার করতে হবে, যাতে AOP কার্যকরী হয়। Spring Boot এর মধ্যে AOP কার্যকর করার জন্য আপনাকে @EnableAspectJAutoProxy অ্যনোটেশন ব্যবহার করতে হবে। এটি আপনার কনফিগারেশনে Aspect ব্যবহারের জন্য প্রয়োজন।

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

এখানে, @EnableAspectJAutoProxy স্প্রিংকে বলে যে AOP সাপোর্ট সক্রিয় করতে হবে।

Step 4: Application Class

Spring Boot অ্যাপ্লিকেশন চালানোর জন্য একটি main class থাকতে হবে, যেখানে SpringApplication.run() কল করা হবে।

package com.example;

import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Calling the method to see the after advice in action
        System.out.println(userService.getUserInfo(101));
    }
}

এখানে:

  • CommandLineRunner ব্যবহার করা হয়েছে অ্যাপ্লিকেশন শুরু হলে getUserInfo() মেথড কল করার জন্য, যাতে After Advice কার্যকরী হয়।

Output

এখন আপনি যখন Spring Boot অ্যাপ্লিকেশন চালাবেন, আপনি কনসোলে নিচের আউটপুট দেখতে পাবেন:

Fetching user info for user ID: 101
User Info: [User ID: 101, Name: John Doe]
After method execution - Logging after UserInfo retrieval.

এখানে:

  • প্রথমে getUserInfo() মেথডটি কল হয়েছে এবং ইউজারের তথ্য রিটার্ন করেছে।
  • তারপর @After অ্যাডভাইস কার্যকর হয়েছে এবং লগে একটি বার্তা দেখানো হয়েছে।

@After Annotation এর ব্যবহারিক সুবিধা

  1. Post-Processing: @After অ্যাডভাইস মেথডের এক্সিকিউশনের পরে কিছু কাজ (যেমন, লগিং, স্টেটাস আপডেট, ট্রানজেকশন ক্লোজ) সম্পন্ন করতে সহায়তা করে।
  2. Error Handling: মেথড সফলভাবে শেষ হওয়ার পরেও অ্যাডভাইস কার্যকর হতে পারে, তাই আপনি ব্যতিক্রম বা ত্রুটি দেখলেও কিছু পরবর্তী কাজ করতে পারবেন।
  3. Reusability: AOP আপনাকে একই কোড পুনরায় না লিখে, এক জায়গায় সেন্ট্রালাইজডভাবে ক্রস-কাটিং কনসার্ন (যেমন, লগিং, সিকিউরিটি) পরিচালনা করতে দেয়।

সারাংশ

Spring AOP তে @After অ্যনোটেশন ব্যবহার করে After Advice তৈরি করা সম্ভব, যা মেথডের এক্সিকিউশনের পরে কার্যকর হয়। এটি ব্যাচ প্রসেসিং বা মেথড কলের পরবর্তী ক্রিয়াকলাপগুলির জন্য উপকারী, যেমন লগিং, রিসোর্স রিলিজ বা কোনো স্টেটাস আপডেট করা। @After অ্যাডভাইস ব্যবহারে, আমরা সহজে cross-cutting concerns (যেমন লগিং, নিরাপত্তা, ট্রানজেকশন ম্যানেজমেন্ট) ব্যাচ প্রসেসিংয়ের বাইরে একটি সাধারণ, পুনঃব্যবহারযোগ্য কৌশলে একত্রিত করতে পারি।


Content added By

Spring AOP (Aspect-Oriented Programming) হল একটি শক্তিশালী কৌশল যা ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট ইত্যাদি) গুলি মূল লজিকের বাইরে রেখে পরিচালনা করতে সাহায্য করে। এতে, আপনি যেকোনো ফাংশন বা মেথডের আগে বা পরে অতিরিক্ত কার্যক্রম (advice) যুক্ত করতে পারেন। এর মধ্যে দুটি প্রধান Advice হল Before Advice এবং After Advice

  • Before Advice: এটি টার্গেট মেথড কল হওয়ার আগে কার্যকর হয়।
  • After Advice: এটি টার্গেট মেথড কল হওয়ার পরে কার্যকর হয়।

এখানে, আমরা Before Advice এবং After Advice এর ব্যবহার দেখব।


Before Advice

Before Advice হল এমন একটি অ্যাডভাইস যা টার্গেট মেথডের কল হওয়ার আগে কার্যকর হয়। এটি সাধারণত লগিং, সিকিউরিটি চেকিং, অথবা অন্যান্য প্রক্রিয়া সম্পাদন করার জন্য ব্যবহৃত হয়, যা মেথড কল হওয়ার আগেই সম্পন্ন হতে হবে।

উদাহরণ: Before Advice ব্যবহার

ধরা যাক, আমাদের একটি সিম্পল সেবা (service) ক্লাস আছে, যেখানে একটি মেথড রয়েছে যেটি কিছু কার্যকলাপ (action) সম্পাদন করে। আমরা চাই, যখন এই মেথড কল হবে, তখন তার আগে কিছু লগিং করা হোক।

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.MyService.performAction(..))")
    public void logBefore(JoinPoint joinPoint) {
        // মেথড কল হওয়ার আগে লগিং
        System.out.println("Executing method: " + joinPoint.getSignature().getName());
    }
}

এখানে:

  • @Before অ্যানোটেশনটি ব্যবহার করা হয়েছে যা execution(* com.example.service.MyService.performAction(..)) পয়েন্টকাট এক্সপ্রেশনটি সিলেক্ট করে, যার মানে হল, MyService ক্লাসের performAction মেথড কল হওয়ার আগে logBefore মেথডটি কার্যকর হবে।
  • joinPoint.getSignature().getName() মেথডের নামটি বের করতে ব্যবহৃত হচ্ছে।

Service Class

@Service
public class MyService {

    public void performAction() {
        System.out.println("Action performed!");
    }
}

এখানে, performAction মেথড কল হওয়ার আগে logBefore অ্যাডভাইসটি কার্যকর হবে এবং কনসোলে মেথডের নাম প্রিন্ট করবে।


After Advice

After Advice হল এমন একটি অ্যাডভাইস যা টার্গেট মেথড কল হওয়ার পরে কার্যকর হয়। এটি সাধারণত মেথডটি সফলভাবে সম্পন্ন হওয়ার পর কিছু কাজ করতে ব্যবহৃত হয়, যেমন রিসোর্স ক্লোজ করা, লগিং বা ডেটা ফিল্টার করা।

উদাহরণ: After Advice ব্যবহার

ধরা যাক, আমরা একটি processData মেথড কল করার পর কিছু ফিনালাইজেশন বা লগিং করতে চাই। আমরা After Advice ব্যবহার করব যেটি মেথডের পরে কার্যকর হবে।

@Aspect
@Component
public class LoggingAspect {

    @After("execution(* com.example.service.MyService.processData(..))")
    public void logAfter(JoinPoint joinPoint) {
        // মেথড কল হওয়ার পরে লগিং
        System.out.println("Method executed: " + joinPoint.getSignature().getName());
    }
}

এখানে:

  • @After অ্যানোটেশনটি ব্যবহার করা হয়েছে, যা execution(* com.example.service.MyService.processData(..)) পয়েন্টকাট এক্সপ্রেশনটি সিলেক্ট করে, যার মানে হল, processData মেথড কল হওয়ার পরে logAfter মেথডটি কার্যকর হবে।
  • joinPoint.getSignature().getName() মেথডের নামটি বের করার জন্য ব্যবহৃত হচ্ছে।

Service Class

@Service
public class MyService {

    public void processData() {
        System.out.println("Data processed!");
    }
}

এখানে, processData মেথড কল হওয়ার পর logAfter অ্যাডভাইসটি কার্যকর হবে এবং কনসোলে মেথডের নাম প্রিন্ট করবে।


Before এবং After Advice একত্রে ব্যবহার করা

Spring AOP এ, আপনি Before Advice এবং After Advice একত্রে ব্যবহার করতে পারেন যাতে একটি মেথডের আগে এবং পরে আলাদা আলাদা কার্যকলাপ সম্পাদন করা যায়।

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.MyService.performAction(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method execution: " + joinPoint.getSignature().getName());
    }

    @After("execution(* com.example.service.MyService.performAction(..))")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("After method execution: " + joinPoint.getSignature().getName());
    }
}

এখানে, performAction মেথডের আগে এবং পরে আলাদা আলাদা লগিং করা হয়েছে। logBefore মেথড মেথড কল হওয়ার আগে এবং logAfter মেথড মেথড কল হওয়ার পরে কার্যকর হবে।


সারাংশ

  • Before Advice: এটি টার্গেট মেথড কল হওয়ার আগে কার্যকর হয় এবং এটি সাধারণত লগিং, সিকিউরিটি চেক, বা প্রি-প্রসেসিং কাজের জন্য ব্যবহৃত হয়।
  • After Advice: এটি টার্গেট মেথড কল হওয়ার পরে কার্যকর হয় এবং এটি সাধারণত পোস্ট-প্রসেসিং, রিসোর্স ক্লোজিং বা লগিংয়ের জন্য ব্যবহৃত হয়।

Spring AOP আপনাকে এই ধরনের কার্যক্রম সহজে বাস্তবায়ন করতে সাহায্য করে, যা কোডকে পরিষ্কার এবং পুনঃব্যবহারযোগ্য রাখে। Before Advice এবং After Advice ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে ক্রস-কাটিং কনসার্ন কার্যকরভাবে পরিচালনা করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...