AOP Proxies

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

529

Aspect-Oriented Programming (AOP) হল একটি প্রোগ্রামিং প্যারাডাইম যা ক্রস-কাটিং কনসার্ন (যেমন লগিং, ট্রানজেকশন ম্যানেজমেন্ট, সিকিউরিটি চেক) সমাধান করার জন্য ব্যবহৃত হয়, যেখানে আপনি সেই ক্রস-কাটিং কনসার্নগুলোকে মূল ব্যবসায়িক লজিক থেকে আলাদা করে রাখতে পারেন। Spring AOP এর মাধ্যমে AOP প্রোডিউস করা হয় এবং তা আসলে proxy ভিত্তিক প্রযুক্তি। Spring AOP সাধারণত dynamic proxies ব্যবহার করে।

Spring AOP-তে Proxy একটি ইন্টারমিডিয়েট অবজেক্ট হিসেবে কাজ করে, যা আসল অবজেক্টের আগে বা পরে কার্যকর হয় এবং Advice (যেমন: @Before, @After, @Around) প্রয়োগ করে। Spring AOP-তে দুটি ধরনের proxy রয়েছে: JDK Dynamic Proxy এবং CGLIB Proxy

এখানে AOP Proxies এর ধারণা এবং তাদের কাজের প্রক্রিয়া বিস্তারিতভাবে আলোচনা করা হয়েছে।


AOP Proxies কি?

AOP Proxy একটি বিশেষ ধরনের object যা একটি target object এর সামনে থাকে এবং method calls এর আগে এবং পরে অতিরিক্ত লজিক (advice) প্রয়োগ করে। Spring AOP, proxy ব্যবহারের মাধ্যমে aspect এর কার্যকারিতা কার্যকর করে।

Proxy-র মাধ্যমে AOP আচরণ অর্জন করা হয়। একটি proxy মূল object এর মত আচরণ করে, কিন্তু এটি advice বা ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন) ইনজেক্ট করতে সক্ষম হয়।

Proxy types:

  1. JDK Dynamic Proxy:
    • এটি interface-based proxy। অর্থাৎ, এটি কেবলমাত্র ইন্টারফেসের মাধ্যমে Proxy তৈরি করতে পারে।
    • JDK Dynamic Proxy শুধুমাত্র interface-এর মেথডের জন্য proxy তৈরি করে এবং class এর মেথডে কার্যকরী হয় না।
    • Spring AOP যখন interface-এর মাধ্যমে তৈরি proxy ব্যবহার করে, তখন এটি JDK Dynamic Proxy ব্যবহার করে।
  2. CGLIB Proxy:
    • CGLIB (Code Generation Library) হল একটি লাইব্রেরি যা Spring AOP কে class-based proxy তৈরি করতে সাহায্য করে।
    • এটি target class কে subclass করে Proxy তৈরি করে, এবং কাজ করার জন্য মেথড কলের আগে এবং পরে advice যুক্ত করতে পারে।
    • CGLIB Proxy ব্যবহৃত হয় যখন target class কোনো interface implement না করে।

JDK Dynamic Proxy এর উদাহরণ

JDK Dynamic Proxy শুধুমাত্র interfaces এর জন্য কাজ করে। Spring AOP JDK dynamic proxy ব্যবহার করে, যদি target object একটি ইন্টারফেস ইমপ্লিমেন্ট করে।

উদাহরণ: JDK Dynamic Proxy

  1. Target Interface:
public interface MyService {
    void performOperation();
}
  1. Target Class Implementation:
public class MyServiceImpl implements MyService {
    @Override
    public void performOperation() {
        System.out.println("Performing operation...");
    }
}
  1. Aspect (Advice):
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.MyService.performOperation(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Logging before method execution: " + joinPoint.getSignature().getName());
    }
}
  1. Proxy Bean Configuration (Spring Configuration):
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

এখানে, @EnableAspectJAutoProxy Spring AOP এর প্রাথমিক কনফিগারেশন সক্ষম করে। JDK Dynamic Proxy ব্যবহার করে, MyService ইন্টারফেসে ব্যবহৃত মেথডের জন্য LoggingAspect কার্যকর হবে।


CGLIB Proxy এর উদাহরণ

যদি target class কোনো ইন্টারফেস না ইমপ্লিমেন্ট করে, তবে Spring AOP CGLIB Proxy ব্যবহার করে। CGLIB একটি class-based proxy তৈরি করে, যা target class এর subclass তৈরি করে।

উদাহরণ: CGLIB Proxy

  1. Target Class:
public class MyService {

    public void performOperation() {
        System.out.println("Performing operation...");
    }
}
  1. Aspect (Advice):
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.MyService.performOperation(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Logging before method execution: " + joinPoint.getSignature().getName());
    }
}
  1. Proxy Bean Configuration (Spring Configuration):
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // CGLIB Proxy ব্যবহার করতে 'proxyTargetClass' true করতে হবে
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

এখানে, @EnableAspectJAutoProxy(proxyTargetClass = true) দ্বারা CGLIB Proxy ব্যবহার করা হচ্ছে, এবং Spring AOP target class-এ CGLIB Proxy তৈরি করবে, কারণ MyService কোনো ইন্টারফেস ইমপ্লিমেন্ট করে না।


Spring AOP Proxy এর কাজের প্রক্রিয়া

1. Proxy Creation:

Spring AOP একটি proxy object তৈরি করে যা target object এর কার্যকলাপকে নিয়ন্ত্রণ করে। Spring AOP ব্যবহৃত হলে, target object-এর কাছে যাবার আগেই proxy এর মাধ্যমে method call প্রক্রিয়া করা হয়।

2. Advice Application:

  • Before Advice: মেথডের execution-এর আগে advice কার্যকর হয়।
  • After Advice: মেথডের execution-এর পরে advice কার্যকর হয়।
  • Around Advice: এটি মেথডের execution-এর আগে এবং পরে কার্যকর হতে পারে, এবং এটি মেথডের কার্যকারিতা নিয়ন্ত্রণ করতে পারে।

3. Method Interception:

Spring AOP Proxy সুনির্দিষ্ট মেথডে intercept করে এবং সেই মেথডের আগে বা পরে আপনার নির্ধারিত Advice প্রয়োগ করে।

4. Invocation of Target Method:

যদি @Around বা @Before advice এর মাধ্যমে method execution না থেমে যায়, তবে Proxy সাধারণত target method (যেমন: performOperation()) কল করবে।


AOP Proxies-এর সুবিধা

  1. Cross-cutting Concerns: Spring AOP proxies আপনাকে ক্রস-কাটিং কনসার্ন যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ইত্যাদি, সহজে এবং কার্যকরভাবে হ্যান্ডল করতে সাহায্য করে।
  2. Separation of Concerns: AOP proxies দ্বারা, আপনি মূল ব্যবসায়িক লজিক থেকে ক্রস-কাটিং কনসার্ন আলাদা করে রাখতে পারেন, যা কোডের রিইউজেবিলিটি এবং ক্লিন কোড নিশ্চিত করে।
  3. Flexible Advice Application: Spring AOP proxies আপনাকে নির্দিষ্ট মেথডের আগে এবং পরে আচরণ প্রয়োগ করতে সাহায্য করে, যাতে আপনি ডায়নামিকভাবে বিভিন্ন অ্যাডভাইস (যেমন, লগিং, ট্রানজেকশন) প্রয়োগ করতে পারেন।

সারাংশ

Spring AOP-তে AOP Proxy হল একটি মূল উপাদান যা target object এর আগে বা পরে advice কার্যকর করতে ব্যবহৃত হয়। Spring AOP-তে দুটি ধরনের proxy রয়েছে:

  1. JDK Dynamic Proxy: এটি interface-based proxy তৈরি করে এবং শুধুমাত্র ইন্টারফেস মেথডের জন্য কার্যকর।
  2. CGLIB Proxy: এটি class-based proxy তৈরি করে, এবং ক্লাসের মেথডে কার্যকর হয়।

Spring AOP Proxy দিয়ে আপনি cross-cutting concerns (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন) থেকে ব্যবসায়িক লজিক আলাদা করে রাখতে পারেন এবং কোডের রিইউজেবিলিটি ও কার্যকারিতা বৃদ্ধি করতে পারেন।

Content added By

Spring AOP (Aspect-Oriented Programming) একটি প্রোগ্রামিং প্যারাডাইম যা কোডের ক্রস-কাটিং কনসার্ন (cross-cutting concerns) যেমন লগিং, ট্রানজেকশন ম্যানেজমেন্ট, সিকিউরিটি ইত্যাদি আলাদা করে মডুলারভাবে বাস্তবায়ন করতে সাহায্য করে। AOP ব্যবহার করার সময় Proxy একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান হিসেবে কাজ করে। AOP প্রক্রিয়ায় Proxy কীভাবে কাজ করে এবং কেন এটি ব্যবহৃত হয়, তা নিচে বিস্তারিতভাবে আলোচনা করা হবে।


Proxy কি?

Proxy একটি ডিজাইন প্যাটার্ন, যা একটি অবজেক্টের রেপ্রেজেন্টেশন বা রিপ্রেজেন্টেটিভ হিসেবে কাজ করে। এটি একটি সরাসরি অবজেক্টের প্রতিনিধিত্ব করে, কিন্তু মূল অবজেক্টের সাথে কিছু অতিরিক্ত কার্যকারিতা (extra functionality) যোগ করার জন্য ব্যবহৃত হয়। সহজ ভাষায়, এটি মূল অবজেক্টের চারপাশে একটি Wrapper বা পরিবর্ধক হিসেবে কাজ করে, যা মূল কার্যকারিতার উপর অতিরিক্ত কার্যকলাপ (যেমন লগিং, নিরাপত্তা যাচাই, বা ক্যাশিং) যুক্ত করতে সক্ষম হয়।

Spring AOP তে Proxy ব্যবহৃত হয় যাতে:

  • Advice (যেমন Before, After, Around) এক্সিকিউট করার আগে বা পরে কার্যকলাপ সম্পাদন করা যায়।
  • মেথড কলের উপর নিয়ন্ত্রণ পাওয়া যায় এবং অতিরিক্ত লজিক যোগ করা যায়।

Spring AOP তে Proxy কেন ব্যবহার করা হয়?

Spring AOP তে Proxy ব্যবহৃত হয় কারণ এটি AOP-এর একটি মৌলিক অংশ, যা Aspect (যেমন logging, security, or transaction management) এবং মূল business logic মেথডগুলির মধ্যে সেতুবন্ধন তৈরি করে। Proxy ছাড়া AOP কার্যকরীভাবে কাজ করতে পারে না, কারণ Proxy হল সেই উপাদান যা Advice এবং JoinPoint এর মধ্যে যোগাযোগ তৈরি করে।

Spring AOP তে Proxy দুইটি পদ্ধতিতে কাজ করে:

  1. JDK Dynamic Proxy (Interface-based Proxy): যখন target object একটি ইন্টারফেস ইমপ্লিমেন্ট করে তখন Spring AOP JDK Dynamic Proxy ব্যবহার করে।
  2. CGLIB Proxy (Class-based Proxy): যখন target object একটি ক্লাস হয় এবং কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে, তখন Spring AOP CGLIB Proxy ব্যবহার করে।

Proxy Types in Spring AOP

১. JDK Dynamic Proxy (Interface-based Proxy)

JDK Dynamic Proxy তখন ব্যবহৃত হয় যখন target object একটি ইন্টারফেস ইমপ্লিমেন্ট করে। Spring AOP JDK Dynamic Proxy ব্যবহার করে শুধুমাত্র ইন্টারফেসগুলোর উপর প্রক্সি তৈরি করতে পারে, তাই target object যদি একটি ইন্টারফেস ইমপ্লিমেন্ট করে, তাহলে Spring AOP সেই ইন্টারফেসের জন্য একটি Proxy তৈরি করবে এবং সেই Proxy-এর মাধ্যমে অ্যাডভাইজ কার্যকর হবে।

উদাহরণ: JDK Dynamic Proxy

public interface UserService {
    void addUser();
    void updateUser();
}

public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("Adding user...");
    }

    @Override
    public void updateUser() {
        System.out.println("Updating user...");
    }
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.UserService.addUser(..))")
    public void logBefore() {
        System.out.println("Logging before addUser method execution");
    }
}

এখানে, UserService একটি ইন্টারফেস এবং UserServiceImpl তার ইমপ্লিমেন্টেশন। Spring AOP এই ইন্টারফেসের জন্য একটি JDK Dynamic Proxy তৈরি করবে, যার মাধ্যমে addUser() মেথডের আগে LoggingAspect কার্যকর হবে।

২. CGLIB Proxy (Class-based Proxy)

যদি target object কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে এবং শুধুমাত্র একটি ক্লাস হয়, তাহলে Spring AOP CGLIB Proxy ব্যবহার করে। CGLIB Proxy মেথডের আগে এবং পরে কার্যকলাপ (Advice) বাস্তবায়ন করতে সক্ষম হয়, এমনকি যদি target class কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে।

উদাহরণ: CGLIB Proxy

public class UserService {
    public void addUser() {
        System.out.println("Adding user...");
    }

    public void updateUser() {
        System.out.println("Updating user...");
    }
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.UserService.addUser(..))")
    public void logBefore() {
        System.out.println("Logging before addUser method execution");
    }
}

এখানে UserService কোনো ইন্টারফেস ইমপ্লিমেন্ট করছে না, তবে Spring AOP CGLIB Proxy ব্যবহার করে UserService ক্লাসের জন্য একটি Proxy তৈরি করবে, যা LoggingAspect এর Advice কার্যকর করবে।


Spring AOP তে Proxy ব্যবহারের সুবিধা

  1. Cross-cutting Concerns আলাদা করা: Spring AOP Proxy ব্যবহার করে, আপনি Cross-cutting Concerns যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট ইত্যাদি আলাদা করে কোডে প্রয়োগ করতে পারেন। মূল বাণিজ্যিক লজিক (Business Logic) অবিকৃত থাকে এবং কার্যকরভাবে অন্য কোডের সাথে একসঙ্গে কাজ করতে পারে।
  2. Method Interception: Proxy কে ব্যবহার করে, আপনি মেথড কলের আগে, পরে বা ব্যতিক্রম (exception) ঘটলে কিছু অতিরিক্ত কার্যকলাপ (Extra behavior) প্রয়োগ করতে পারেন।
  3. Non-intrusive Code: AOP ব্যবহার করার ফলে মূল কোডে কোন পরিবর্তন না করে অ্যাডভাইজ অ্যাপ্লাই করা যায়। প্রোগ্রামিং লজিকের উপর কোনো সরাসরি প্রভাব না ফেলেই ক্রস-কাটিং কনসার্ন যুক্ত করা সম্ভব।
  4. Performance Improvement: AOP প্রোগ্রামিং দিয়ে যখন কাস্টম প্রক্রিয়া, যেমন ক্যাশিং বা ট্রানজেকশন ম্যানেজমেন্ট যুক্ত করা হয়, তখন এটি মেথডের পারফরম্যান্সকে উন্নত করতে সহায়ক হতে পারে।

Spring AOP Proxy তে ব্যবহার করা হয় কেন?

Spring AOP তে Proxy ব্যবহার করা হয় কারণ এটি Advice এবং JoinPoint এর মধ্যে সেতুবন্ধন হিসেবে কাজ করে। Proxy-এর মাধ্যমে Spring AOP মেথডে অতিরিক্ত কার্যকারিতা (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন) যোগ করতে পারে এবং এটি মূল বাণিজ্যিক লজিকের উপর কোনো প্রভাব না ফেলেই কার্যকর হয়। এই কারণে, AOP অনেক ক্ষেত্রেই কোডের পুনঃব্যবহারযোগ্যতা বাড়াতে, কোডের জটিলতা কমাতে এবং বিভিন্ন ক্রস-কাটিং কনসার্ন সহজভাবে ম্যানেজ করতে ব্যবহৃত হয়।


সারাংশ

Spring AOP তে Proxy একটি গুরুত্বপূর্ণ উপাদান, যা Advice এবং JoinPoint এর মধ্যে সেতুবন্ধন তৈরি করে। JDK Dynamic Proxy ব্যবহার করা হয় যখন target object ইন্টারফেস ইমপ্লিমেন্ট করে এবং CGLIB Proxy ব্যবহার করা হয় যখন target object কোনো ইন্টারফেস ইমপ্লিমেন্ট করে না। Proxy এর মাধ্যমে Spring AOP ক্রস-কাটিং কনসার্ন যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ইত্যাদি কার্যকরীভাবে বাস্তবায়ন করতে সক্ষম হয়। AOP প্রোগ্রামিংয়ের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা বাড়ানো, কোডের জটিলতা কমানো এবং কার্যকরী ফলাফল পাওয়া সম্ভব।

Content added By

স্প্রিং এওপি (Spring AOP) ব্যাচ প্রসেসিং এবং ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট) ম্যানেজ করার জন্য একটি শক্তিশালী পদ্ধতি। স্প্রিং এওপি প্রক্সি প্যাটার্ন ব্যবহার করে Join Points এবং Advice পরিচালনা করে, যা মেথড কলের সময় নির্দিষ্ট অ্যাকশন কার্যকর করে। স্প্রিং এওপি প্রক্সি তৈরির জন্য দুটি প্রধান প্রকারের প্রক্সি ব্যবহার করে: JDK Dynamic Proxy এবং CGLIB Proxy

প্রক্সি ক্লাস বা অবজেক্ট হল একটি অস্থায়ী ক্লাস যা মূল ক্লাসের মতোই আচরণ করে, তবে এতে কিছু অতিরিক্ত আচরণ (এডভাইস) যুক্ত করা হয়। স্প্রিংে, JDK Dynamic Proxy এবং CGLIB Proxy এই দুটি প্রক্সি মেকানিজম ব্যবহৃত হয়।

এখানে আমরা JDK Dynamic Proxy এবং CGLIB Proxy এর ভূমিকা এবং পার্থক্য সম্পর্কে বিস্তারিত আলোচনা করব।


JDK Dynamic Proxy

JDK Dynamic Proxy হল একটি প্রকারের প্রক্সি যা শুধুমাত্র ইন্টারফেস এর জন্য কাজ করে। যখন আপনি একটি JDK Dynamic Proxy ব্যবহার করেন, তখন স্প্রিং কনটেইনার একটি ডাইনামিক প্রক্সি ক্লাস তৈরি করে যা মূল ক্লাসের ইন্টারফেস ইমপ্লিমেন্ট করে এবং সেটির আচরণ বজায় রেখে অ্যাডভাইস প্রয়োগ করে।

JDK Dynamic Proxy এর কাজের প্রক্রিয়া:

  1. ইন্টারফেস থাকা উচিত: JDK Dynamic Proxy শুধুমাত্র ইন্টারফেসের মাধ্যমে কাজ করে, এর মানে হচ্ছে যে এটি এমন ক্লাসের জন্য ব্যবহৃত হয় যা একটি ইন্টারফেস ইমপ্লিমেন্ট করে।
  2. Proxy Creation: যখন @Aspect বা প্রক্সি অ্যাডভাইস তৈরি হয়, তখন স্প্রিং জিডিকে ডাইনামিক প্রক্সি তৈরি করে।
  3. Method Invocation: যেকোনো মেথড কলের সময়, প্রক্সি ক্লাস অ্যাডভাইস বা মেথডের আগে বা পরে কোনো নির্দিষ্ট আচরণ কার্যকর করে।

উদাহরণ: JDK Dynamic Proxy

import org.springframework.stereotype.Component;

public interface EmployeeService {
    void addEmployee();
}

@Component
public class EmployeeServiceImpl implements EmployeeService {
    @Override
    public void addEmployee() {
        System.out.println("Employee added");
    }
}

Aspect Class:

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

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.EmployeeService.addEmployee())")
    public void logBefore() {
        System.out.println("Method addEmployee() is about to be executed");
    }
}

Spring Configuration:

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

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {

    @Bean
    public EmployeeService employeeService() {
        return new EmployeeServiceImpl();
    }
}

এখানে, JDK Dynamic Proxy ব্যবহৃত হয়েছে কারণ EmployeeService একটি ইন্টারফেস এবং আমরা এটি প্রক্সি করেছি।


CGLIB Proxy

CGLIB (Code Generation Library) হল একটি তৃতীয় পক্ষের লাইব্রেরি যা স্প্রিং এর প্রক্সি তৈরি করতে ব্যবহৃত হয়। CGLIB Proxy মূলত কোনো ক্লাসের সাবক্লাস তৈরি করে এবং এতে অ্যাডভাইস যুক্ত করে। এটি ইন্টারফেস ছাড়াও যেকোনো ক্লাসের জন্য প্রক্সি তৈরি করতে সক্ষম। CGLIB ব্যবহার করার জন্য কোনো ইন্টারফেস থাকতে হবে না, এটি সরাসরি ক্লাসের উপরে কাজ করে।

CGLIB Proxy এর কাজের প্রক্রিয়া:

  1. Subclass Creation: CGLIB একটি নতুন ক্লাস তৈরি করে যা মূল ক্লাসের একটি সাবক্লাস।
  2. Method Interception: এই সাবক্লাসে মেথডগুলিকে ইন্টারসেপ্ট করা হয় এবং সেখানে অ্যাডভাইস অ্যাড করা হয়।
  3. Direct Class Proxying: CGLIB ক্লাসের জন্য ব্যবহৃত হয় যেগুলোর কোনো ইন্টারফেস নেই।

উদাহরণ: CGLIB Proxy

import org.springframework.stereotype.Component;

public class EmployeeService {
    public void addEmployee() {
        System.out.println("Employee added");
    }
}

Aspect Class:

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

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.EmployeeService.addEmployee())")
    public void logBefore() {
        System.out.println("Method addEmployee() is about to be executed");
    }
}

Spring Configuration:

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

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)  // Use CGLIB proxy
public class AppConfig {

    @Bean
    public EmployeeService employeeService() {
        return new EmployeeService();
    }
}

এখানে, @EnableAspectJAutoProxy(proxyTargetClass = true) দ্বারা স্প্রিংকে CGLIB প্রক্সি ব্যবহার করার নির্দেশ দেওয়া হয়েছে।


JDK Dynamic Proxy এবং CGLIB Proxy এর মধ্যে পার্থক্য

বৈশিষ্ট্যJDK Dynamic ProxyCGLIB Proxy
প্রক্সি ধরনেরইন্টারফেস ভিত্তিক প্রক্সিক্লাস ভিত্তিক প্রক্সি
সীমাবদ্ধতাশুধুমাত্র ইন্টারফেস ইমপ্লিমেন্ট করা ক্লাসে কাজ করেকোনো ইন্টারফেস ছাড়া সরাসরি ক্লাসের জন্য কাজ করে
সাবক্লাস তৈরিকোনো সাবক্লাস তৈরি করে নাএকটি সাবক্লাস তৈরি করে
প্রকল্পের কার্যকারিতাইনহেরিটেড মেথডের জন্য কাজ করে নাইনহেরিটেড মেথডের জন্য কাজ করতে পারে
পারফরম্যান্সCGLIB এর তুলনায় কিছুটা কম পারফরম্যান্সবেশি পারফরম্যান্স

কোন পরিস্থিতিতে কোন প্রক্সি ব্যবহার করবেন?

  1. JDK Dynamic Proxy: যদি আপনার ক্লাস ইন্টারফেস ইমপ্লিমেন্ট করে, তবে JDK Dynamic Proxy ব্যবহার করা উচিত। এটি বেশি নমনীয় এবং ইন্টারফেস ভিত্তিক। সাধারণত, এটি সার্ভিস বা ডিএও ক্লাসের জন্য ব্যবহৃত হয়।
  2. CGLIB Proxy: যদি আপনার ক্লাস কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে, তবে CGLIB Proxy ব্যবহার করতে হবে। CGLIB সরাসরি ক্লাসের সাবক্লাস তৈরি করে, তাই আপনি ক্লাসের মেথডে প্রক্সি অ্যাড করতে পারেন।

সারাংশ

স্প্রিং এওপি (Spring AOP) তে JDK Dynamic Proxy এবং CGLIB Proxy দুটি গুরুত্বপূর্ণ প্রক্সি মেকানিজম, যা নির্দিষ্ট পয়েন্টকাট এবং অ্যাডভাইস প্রয়োগের জন্য ব্যবহৃত হয়। JDK Dynamic Proxy ইন্টারফেস ভিত্তিক প্রক্সি তৈরি করে, এবং CGLIB Proxy সরাসরি ক্লাসের সাবক্লাস তৈরি করে। এই দুটি প্রক্সি ব্যবহারের সিদ্ধান্ত মূলত আপনার ক্লাসের আর্কিটেকচার এবং প্রয়োজনে নির্ভর করে।

Content added By

Spring AOP (Aspect-Oriented Programming) এর মাধ্যমে, Proxy ব্যবহার করে একটি Aspect (যেমন লোগিং, সিকিউরিটি, ট্রান্সঅ্যাকশন ম্যানেজমেন্ট) বিভিন্ন পয়েন্টে প্রয়োগ করা হয়। Spring AOP প্রাথমিকভাবে JDK Dynamic Proxy অথবা CGLIB Proxy ব্যবহার করে একটি target অবজেক্টের চারপাশে একটি প্রোক্সি তৈরি করে, যা সেই অবজেক্টের ওপর বিভিন্ন ক্রস-কাটিং কনসার্ন কার্যকর করে।

Spring AOP তে Proxy ব্যবহার করার মাধ্যমে আমরা একটি অবজেক্টের কার্যকারিতাকে বর্ধিত করতে পারি, যেমন, কোন মেথড রান হওয়ার আগে বা পরে অতিরিক্ত কোড চালানো।

এখানে Proxy ব্যবহারের উদাহরণ দেখানো হবে, যেখানে JDK Dynamic Proxy এবং CGLIB Proxy এর মাধ্যমে AOP ব্যবহার করা হবে।


1. Proxy কি?

Proxy হল একটি অবজেক্ট যা আসল অবজেক্টের প্রতিনিধিত্ব করে এবং তার কার্যকারিতা অনুকরণ করে। Spring AOP এ Proxy তৈরি করা হয় যাতে অ্যাপ্লিকেশনের মেথড কলের আগের বা পরের কার্যক্রম নির্ধারণ করা যায়।

Spring AOP সাধারণত দুটি ধরণের Proxy ব্যবহার করে:

  • JDK Dynamic Proxy: যদি টার্গেট অবজেক্টটি একটি ইন্টারফেস ইমপ্লিমেন্ট করে, তবে Spring একটি JDK ডায়নামিক প্রোক্সি তৈরি করে।
  • CGLIB Proxy: যদি টার্গেট অবজেক্টটি কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে, তবে CGLIB (Code Generation Library) ব্যবহার করে Spring একটি সাব-ক্লাস প্রোক্সি তৈরি করে।

2. Spring AOP এ Proxy ব্যবহারের উদাহরণ

এই উদাহরণে আমরা দেখব কিভাবে Spring AOP Proxy ব্যবহার করে একটি LoggingAspect অ্যাপ্লাই করা যায়, যা JDK Dynamic Proxy এর মাধ্যমে কাজ করবে। উদাহরণস্বরূপ, আমরা একটি UserService ক্লাস তৈরি করব এবং তার ওপর LoggingAspect প্রোক্সি প্রয়োগ করব।

2.1 প্রজেক্ট ডিপেনডেন্সি

প্রথমে আপনার pom.xml ফাইলে নিচের ডিপেনডেন্সি যোগ করতে হবে:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter AOP -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

2.2 Service ক্লাস (Target Class)

এখন একটি Service ক্লাস তৈরি করা হবে, যেটি createUser() এবং deleteUser() মেথড থাকবে।

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.");
    }
}

এখানে, UserService ক্লাস দুটি মেথড রাখে যা ইউজার তৈরি এবং মুছে ফেলার কাজ করে।

2.3 Aspect (Proxy) তৈরি করা

Spring AOP Proxy ব্যবহার করে Before এবং After Advice কার্যকর করা যাবে। LoggingAspect ক্লাসে আমরা @Before এবং @After অ্যানোটেশন দিয়ে কার্যক্রম শুরু এবং শেষের লগিং কার্যকর করব।

package com.example.demo.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
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");
    }

    // @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");
    }
}

এখানে:

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

2.4 Application ক্লাস (Main Class)

Spring Boot অ্যাপ্লিকেশনে UserService মেথড কল করার জন্য CommandLineRunner ইন্টারফেস ব্যবহার করা হবে।

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");
    }
}

এখানে, CommandLineRunner ব্যবহার করে আমরা UserService এর মেথডগুলো কল করেছি।

2.5 Proxy এর মাধ্যমে Advice কার্যকর করা

Spring AOP দ্বারা একটি Proxy তৈরি করা হবে, যেখানে LoggingAspect এর beforeMethodExecution() এবং afterMethodExecution() মেথডগুলি UserService এর মেথডের আগে এবং পরে কার্যকর হবে।

2.6 আউটপুট

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

এখানে, Before Advice মেথড কল হওয়ার আগে এবং After Advice মেথড কল হওয়ার পরে কার্যকর হবে।


3. JDK Dynamic Proxy এবং CGLIB Proxy

Spring AOP দ্বারা দুইটি ধরনের প্রোক্সি তৈরি করা যায়:

  1. JDK Dynamic Proxy: যদি টার্গেট ক্লাস একটি ইন্টারফেস ইমপ্লিমেন্ট করে, তাহলে Spring JDK Dynamic Proxy ব্যবহার করবে।
  2. CGLIB Proxy: যদি টার্গেট ক্লাস কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে, তাহলে Spring CGLIB Proxy ব্যবহার করবে।

3.1 JDK Dynamic Proxy

যদি UserService ক্লাস একটি ইন্টারফেস UserServiceInterface ইমপ্লিমেন্ট করে, তবে Spring AOP JDK Dynamic Proxy তৈরি করবে।

UserServiceInterface

package com.example.demo.service;

public interface UserServiceInterface {
    void createUser(String userName);
    void deleteUser(String userName);
}

UserService ইমপ্লিমেন্টেশন

package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class UserService implements UserServiceInterface {

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

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

এখানে, UserService এখন UserServiceInterface ইমপ্লিমেন্ট করছে এবং Spring JDK Dynamic Proxy ব্যবহার করবে।

3.2 CGLIB Proxy

যদি UserService ক্লাস কোনো ইন্টারফেস ইমপ্লিমেন্ট না করে, তবে Spring CGLIB Proxy ব্যবহার করবে, যা সরাসরি ক্লাসের সাবক্লাস তৈরি করে।


সারাংশ

Spring AOP এ Proxy ব্যবহারের মাধ্যমে আপনি একটি টার্গেট ক্লাসের উপর ক্রস-কাটিং কনসার্ন কার্যকর করতে পারেন। Before এবং After Advice এর মাধ্যমে মেথডের আগে বা পরে অতিরিক্ত কাজ করা সম্ভব হয়। Spring AOP JDK Dynamic Proxy এবং CGLIB Proxy ব্যবহার করে প্রোক্সি তৈরি করে, যার মাধ্যমে AOP কার্যক্রম একটি টার্গেট মেথডে প্রয়োগ করা যায়। Spring AOP এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি পায়।

Content added By
Promotion

Are you sure to start over?

Loading...