Guice-এ @Singleton অ্যানোটেশন এবং Singleton Scope ব্যবস্থাপনা গুরুত্বপূর্ণ একটি ধারণা, যা একবার ইনস্ট্যান্স তৈরি করার মাধ্যমে আপনার অ্যাপ্লিকেশনকে দক্ষ এবং কার্যকরী করে তোলে। Singleton Scope ব্যবহার করে নিশ্চিত করা হয় যে একটি নির্দিষ্ট ক্লাসের কেবল একটিমাত্র ইনস্ট্যান্স তৈরি হবে এবং সেটি সারা অ্যাপ্লিকেশনে ব্যবহৃত হবে।
@Singleton Annotation
Guice-এ @Singleton অ্যানোটেশন একটি ক্লাসে ব্যবহৃত হয়, যা নির্দেশ করে যে সেই ক্লাসের কেবল একটি ইনস্ট্যান্স থাকবে এবং সেই ইনস্ট্যান্স পুরো অ্যাপ্লিকেশনে পুনরায় ব্যবহার হবে। এই অ্যানোটেশনটি Singleton Scope নির্ধারণ করতে সাহায্য করে। এটি কার্যকরী যখন আমরা চাই যে কোনো নির্দিষ্ট ক্লাসের একাধিক ইনস্ট্যান্স তৈরি না হয়ে একটিমাত্র ইনস্ট্যান্সই ব্যবহার হোক।
@Singleton Annotation এর ব্যবহার
1. @Singleton অ্যানোটেশন দিয়ে ক্লাস মার্ক করা
import com.google.inject.Singleton;
@Singleton
public class MyService {
public void execute() {
System.out.println("Service is executed!");
}
}
এখানে, @Singleton অ্যানোটেশন MyService ক্লাসের জন্য নিশ্চিত করে যে Guice শুধুমাত্র একটি ইনস্ট্যান্স তৈরি করবে এবং সেই ইনস্ট্যান্স সারা অ্যাপ্লিকেশন জুড়ে ব্যবহার হবে।
2. @Singleton এর সাহায্যে Guice-এ Singleton ইনজেকশন
Guice-এ যখন আপনি @Singleton ব্যবহার করেন, তখন এটি ক্লাসের জন্য সিঙ্গেলটন লাইফসাইকেল পরিচালনা করে। এতে, Guice নিশ্চিত করে যে ক্লাসের একটাই ইনস্ট্যান্স তৈরি হয়, এবং সেটি ইনজেক্ট করা হবে যখনই প্রয়োজন হবে।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class MainApp {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MyModule());
MyService service1 = injector.getInstance(MyService.class);
MyService service2 = injector.getInstance(MyService.class);
// চেক করুন যদি service1 এবং service2 একই ইনস্ট্যান্স
System.out.println(service1 == service2); // Output: true
}
}
এখানে service1 এবং service2 একই ইনস্ট্যান্স হবে এবং true আউটপুট প্রদান করবে কারণ Guice একটাই ইনস্ট্যান্স তৈরি করেছে এবং এটি সারা অ্যাপ্লিকেশনে শেয়ার করছে।
Singleton Scope ব্যবস্থাপনা
Guice-এ Singleton Scope ম্যানেজ করতে বিভিন্ন পদ্ধতি ব্যবহার করা হয়। @Singleton অ্যানোটেশন ব্যবহার করার পাশাপাশি আপনি in(Singleton.class) মেথডও ব্যবহার করতে পারেন, যা একে সিঙ্গেলটন স্কোপে বাইন্ড করতে সাহায্য করে।
1. in(Singleton.class) ব্যবহার করে Singleton Scope সেট করা
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(MyService.class).to(MyServiceImpl.class).in(Singleton.class);
}
}
এখানে, bind(MyService.class).to(MyServiceImpl.class).in(Singleton.class) দিয়ে আপনি MyService-কে MyServiceImpl ক্লাসের সাথে সিঙ্গেলটন স্কোপে বাইন্ড করছেন।
2. @Singleton অ্যানোটেশন এবং in(Singleton.class) এর মধ্যে পার্থক্য
@Singletonঅ্যানোটেশন: এটি ক্লাসের নিজস্ব সিঙ্গেলটন স্কোপ তৈরি করে এবং Guice-এর জন্য এটি নির্দেশ করে যে একটি ক্লাসের কেবল একটিমাত্র ইনস্ট্যান্স তৈরি করা হবে।in(Singleton.class): এটি AbstractModule বা বাইন্ডিং কনফিগারেশনে ব্যবহার করা হয় এবং Guice-কে বলে যে এই বাইন্ডিংটি সিঙ্গেলটন স্কোপে থাকবে।
এখন, যদি আপনি একই বাইন্ডিংয়ে একাধিক পদ্ধতি ব্যবহার করেন, তবে তারা একে অপরের সাথে মিলে যাবে। যেমন:
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(MyService.class).to(MyServiceImpl.class); // Bind MyService to MyServiceImpl
bind(MyService.class).in(Singleton.class); // Ensure MyService is a Singleton
}
}
এক্ষেত্রে Guice শুধুমাত্র একটি ইনস্ট্যান্স তৈরি করবে, এবং এটি সমস্ত স্থানে পুনরায় ব্যবহার করা হবে।
Singleton-এ ডিপেনডেন্সি ইনজেকশন
যখন একটি সিঙ্গেলটন ক্লাসের ডিপেনডেন্সি ইনজেক্ট করতে হয়, তখন Guice নিশ্চিত করে যে সেই ডিপেনডেন্সিও সিঙ্গেলটন হবে।
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class MyService {
private final MyDatabaseConnection dbConnection;
@Inject
public MyService(MyDatabaseConnection dbConnection) {
this.dbConnection = dbConnection;
}
public void execute() {
dbConnection.connect();
System.out.println("Service is executed!");
}
}
@Singleton
public class MyDatabaseConnection {
public void connect() {
System.out.println("Database connected!");
}
}
এখানে, MyService এবং MyDatabaseConnection উভয়ই সিঙ্গেলটন, এবং MyService-এর ডিপেনডেন্সি MyDatabaseConnection-এর একটি একক ইনস্ট্যান্স ব্যবহার করবে।
Guice-এ @Singleton অ্যানোটেশন এবং Singleton Scope ব্যবস্থাপনা ব্যবহারের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে ক্লাসের জন্য কেবল একটি ইনস্ট্যান্স তৈরি হবে এবং সেটি সারা অ্যাপ্লিকেশনে শেয়ার হবে। এটি মেমোরি ব্যবস্থাপনা এবং কর্মক্ষমতা উন্নত করতে সহায়ক, বিশেষত যখন আপনার ক্লাসগুলি একে অপরের উপর নির্ভরশীল হয় এবং আপনি চান না যে বারবার ইনস্ট্যান্স তৈরি হোক। Guice-এর এই কার্যকারিতা আপনার অ্যাপ্লিকেশনে Dependency Injection ব্যবস্থাপনাকে আরও কার্যকর এবং দক্ষ করে তোলে।