Guice Dependency Injection Framework এ Cross-cutting Concerns যেমন Logging, Transaction Management ইত্যাদি হ্যান্ডল করা একটি সাধারণ চ্যালেঞ্জ। সাধারণভাবে, ক্রস-কাটিং কনসার্নগুলির মধ্যে এমন কার্যকলাপ থাকে যা প্রোগ্রামের বিভিন্ন অংশে বারবার পুনরাবৃত্তি হয়, যেমন লগিং, ট্রানজেকশন ম্যানেজমেন্ট, এবং সিকিউরিটি। Guice এ এসব কনসার্নগুলি সাধারণভাবে AOP (Aspect-Oriented Programming) এর মাধ্যমে হ্যান্ডল করা হয়।
Guice নিজে AOP সাপোর্ট করে না, তবে আপনি Guice এর সাথে AOP কনসেপ্ট প্রয়োগ করতে পারেন Guice AOP বা Guice Interceptors ব্যবহার করে। এই প্রক্রিয়ায়, ক্রস-কাটিং কনসার্নগুলিকে মডুলার ও পুনরাবৃত্তি করা এড়ানো সম্ভব হয়।
এখানে, আমরা দুটি সাধারণ ক্রস-কাটিং কনসার্ন (Logging এবং Transaction Management) Guice ব্যবহার করে কীভাবে হ্যান্ডল করা যায়, তার উদাহরণ দেখাব।
1. Logging (ক্রস-কাটিং কনসার্ন হিসেবে Logging)
Logging একটি সাধারণ ক্রস-কাটিং কনসার্ন যা প্রায় সব অ্যাপ্লিকেশনেই প্রয়োজন। Guice এর মাধ্যমে, আপনি Interceptor ব্যবহার করে কোনও মেথডের জন্য লগিং অ্যাসপেক্ট অ্যাড করতে পারেন।
Logging Interceptor Example:
Logger Interface: প্রথমে, একটি সাধারণ Logger Interface তৈরি করুন:
public interface Logger { void log(String message); }Logger Implementation: এরপর,
Loggerইন্টারফেসের একটি বাস্তবায়ন তৈরি করুন:public class ConsoleLogger implements Logger { @Override public void log(String message) { System.out.println(message); } }Logging Interceptor: Guice ইন্টারসেপ্টর ব্যবহার করে মেথডের লগ তৈরি করুন:
import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.matcher.Matcher; import com.google.inject.AbstractModule; import com.google.inject.aop.Interceptor; import com.google.inject.aop.MethodInterceptor; import com.google.inject.aop.Invocation; public class LoggingInterceptor implements MethodInterceptor { private final Logger logger; @Inject public LoggingInterceptor(Logger logger) { this.logger = logger; } @Override public Object invoke(Invocation invocation) throws Throwable { logger.log("Executing: " + invocation.getMethod().getName()); Object result = invocation.proceed(); logger.log("Executed: " + invocation.getMethod().getName()); return result; } }Guice Module with Interceptor: Guice মডিউল তৈরি করে এই ইন্টারসেপ্টরটি অ্যাপ্লিকেশনে যোগ করুন:
import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; import com.google.inject.aop.Aop; public class MyModule extends AbstractModule { @Override protected void configure() { bind(Logger.class).to(ConsoleLogger.class); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Inject.class), new LoggingInterceptor(new ConsoleLogger())); } }Application Class: এখন
Loggerইন্টারফেসের মাধ্যমে আপনার অ্যাপ্লিকেশন ক্লাসে লগিং প্রয়োগ করুন:import com.google.inject.Inject; public class MyApplication { private final Logger logger; @Inject public MyApplication(Logger logger) { this.logger = logger; } public void doSomething() { logger.log("Doing something important..."); } public static void main(String[] args) { Injector injector = Guice.createInjector(new MyModule()); MyApplication app = injector.getInstance(MyApplication.class); app.doSomething(); } }
এখানে, LoggingInterceptor ক্লাসটি ব্যবহার করে Guice এর মাধ্যমে সমস্ত Inject করা মেথডগুলির আগে এবং পরে লগিং কার্যকলাপ যোগ করা হয়েছে। bindInterceptor ব্যবহার করে আমরা Guice কে জানাই যে কোন মেথডে লগিং ইন্টারসেপ্টর প্রয়োগ করতে হবে।
2. Transaction Management (ক্রস-কাটিং কনসার্ন হিসেবে Transaction)
ট্রানজেকশন ম্যানেজমেন্ট একটি সাধারণ ক্রস-কাটিং কনসার্ন যা সাধারণত ডেটাবেস অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। Guice এর মাধ্যমে ট্রানজেকশন ম্যানেজমেন্ট হ্যান্ডল করার জন্যও আপনি Interceptor ব্যবহার করতে পারেন, যাতে ট্রানজেকশন শুরু, কমিট বা রোলব্যাক করা যায়।
Transaction Interceptor Example:
Transaction Interface: একটি সাধারণ ট্রানজেকশন ইন্টারফেস তৈরি করুন:
public interface TransactionManager { void beginTransaction(); void commit(); void rollback(); }Transaction Implementation: একটি ট্রানজেকশন ম্যানেজার বাস্তবায়ন তৈরি করুন:
public class SimpleTransactionManager implements TransactionManager { @Override public void beginTransaction() { System.out.println("Transaction Started"); } @Override public void commit() { System.out.println("Transaction Committed"); } @Override public void rollback() { System.out.println("Transaction Rolled Back"); } }Transaction Interceptor: এখন, একটি Transaction Interceptor তৈরি করুন, যা ট্রানজেকশন শুরু করবে এবং শেষে কমিট বা রোলব্যাক করবে:
import com.google.inject.aop.MethodInterceptor; import com.google.inject.aop.Invocation; public class TransactionInterceptor implements MethodInterceptor { private final TransactionManager transactionManager; public TransactionInterceptor(TransactionManager transactionManager) { this.transactionManager = transactionManager; } @Override public Object invoke(Invocation invocation) throws Throwable { transactionManager.beginTransaction(); try { Object result = invocation.proceed(); transactionManager.commit(); return result; } catch (Exception e) { transactionManager.rollback(); throw e; } } }Guice Module with Transaction Interceptor: Guice মডিউল তৈরি করে ট্রানজেকশন ইন্টারসেপ্টরটি ইনজেক্ট করুন:
import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; import com.google.inject.aop.Aop; public class MyTransactionModule extends AbstractModule { @Override protected void configure() { bind(TransactionManager.class).to(SimpleTransactionManager.class); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Transactional.class), new TransactionInterceptor(new SimpleTransactionManager())); } }Application Class with Transactional Method: একটি
@Transactionalঅ্যানোটেশন ব্যবহার করে ট্রানজেকশনটি মেথডে প্রয়োগ করুন:import com.google.inject.Inject; public class MyTransactionApp { private final TransactionManager transactionManager; @Inject public MyTransactionApp(TransactionManager transactionManager) { this.transactionManager = transactionManager; } @Transactional public void processTransaction() { System.out.println("Processing the transaction..."); } public static void main(String[] args) { Injector injector = Guice.createInjector(new MyTransactionModule()); MyTransactionApp app = injector.getInstance(MyTransactionApp.class); app.processTransaction(); } }এখানে,
@Transactionalঅ্যানোটেশন যুক্ত মেথডে ট্রানজেকশন শুরু, কমিট বা রোলব্যাক হবে, যাTransactionInterceptorদ্বারা হ্যান্ডল করা হবে।
Guice এ Cross-cutting Concerns যেমন Logging এবং Transaction Management হ্যান্ডল করার জন্য আপনি AOP বা Interceptor ব্যবহার করতে পারেন। এগুলোর মাধ্যমে আপনি কোডের পুনরাবৃত্তি এড়িয়ে মডুলার এবং পরিষ্কার কোড লিখতে পারবেন। Guice আপনার ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে এই ক্রস-কাটিং কনসার্নগুলোকে অ্যাপ্লিকেশনের লজিক থেকে আলাদা করে একটি কেন্দ্রীভূত জায়গায় পরিচালনা করতে সক্ষম করে।
Read more