JSR-330 (Java Specification Request 330) হলো Dependency Injection (DI) সম্পর্কিত একটি Java স্পেসিফিকেশন, যা Java EE এবং Java SE প্ল্যাটফর্মে DI স্ট্যান্ডার্ডের জন্য পরিপূর্ন API ডিফাইন করে। এই স্পেসিফিকেশনটি মূলত DI ব্যবহারের জন্য একটি সাধারণ এবং অভ্যন্তরীণ পদ্ধতি নির্ধারণ করে, যা বিভিন্ন DI কনটেইনার ও ফ্রেমওয়ার্কের মধ্যে সামঞ্জস্য বজায় রাখে।
JSR-330 একটি API সরবরাহ করে যা আপনাকে Dependency Injection প্যাটার্ন ব্যবহার করতে সহায়তা করে, এবং এটি ডিপেনডেন্সি ইনজেকশনের জন্য একটি স্ট্যান্ডার্ড পথ প্রদান করে, যা বিভিন্ন ফ্রেমওয়ার্কের মধ্যে একে অপরের সাথে কাজ করতে সক্ষম।
JSR-330 এর মূল ধারণা
JSR-330-এ, এটি ইনজেকশন পদ্ধতি (Constructor, Field, এবং Method Injection) এবং কিভাবে আপনি Dependency Injection কনটেইনারের মধ্যে ডিপেনডেন্সি রেজোল্ভ করতে পারেন সে সম্পর্কে একটি স্পেসিফিকেশন প্রদান করা হয়।
JSR-330 এর মূল উপাদানসমূহ:
- @Inject:
- @Inject অ্যানোটেশনটি ব্যবহার করে ডিপেনডেন্সি ইনজেক্ট করা হয়। এটি তিনটি জায়গায় ব্যবহৃত হতে পারে: কনস্ট্রাক্টর, মেথড, এবং ফিল্ড।
উদাহরণ:
@Inject private Service service;
- @Named:
- @Named অ্যানোটেশনটি একটি Qualifier হিসেবে ব্যবহৃত হয়। এটি বিভিন্ন ইমপ্লিমেন্টেশনের মধ্যে নির্বাচন করার জন্য ব্যবহৃত হয়, যখন একই ধরনের ইন্টারফেসের একাধিক ইমপ্লিমেন্টেশন থাকে।
উদাহরণ:
@Inject @Named("myService") private Service service;
- @Singleton:
- @Singleton অ্যানোটেশনটি একটি ক্লাসকে সিঙ্গেলটন হিসেবে মার্ক করে, যার মানে হল যে, DI কনটেইনার একটি মাত্র ইনস্ট্যান্স একবার তৈরি করবে এবং পুনরায় ব্যবহার করবে।
উদাহরণ:
@Singleton public class ServiceImpl implements Service { // implementation }
- @Provider:
- @Provider একটি সাধারণ কনটেইনার যা আপনাকে DI কনটেইনারের মধ্যে সার্ভিস সরবরাহ করতে সাহায্য করে, যখন আপনি চান ডাইনামিকভাবে কিছু ইনস্ট্যান্স তৈরি করতে।
JSR-330 এর গুরুত্ব
- স্ট্যান্ডার্ড API সরবরাহ করা:
- JSR-330 DI এর জন্য একটি স্ট্যান্ডার্ড API প্রদান করে, যা প্ল্যাটফর্মে dependency injection ব্যবহারের জন্য একটি অভ্যন্তরীণ পথ সরবরাহ করে। এটি বিভিন্ন DI কনটেইনার (যেমন Guice, Spring, CDI) এর মধ্যে কমন গ্রাউন্ড তৈরি করে।
- ফ্রেমওয়ার্ক ইন্টিগ্রেশন সহজ করা:
- JSR-330 ব্যবহার করে আপনি কোনো নির্দিষ্ট DI কনটেইনারে আটকে না থেকে বিভিন্ন DI ফ্রেমওয়ার্ক এবং কনটেইনারে আপনার কোড রি-ইউজ করতে পারবেন। যেমন, আপনি Guice বা Spring বা CDI কনটেইনারে একই অ্যানোটেশন ব্যবহার করতে পারেন।
- যেকোনো Java প্ল্যাটফর্মে ব্যবহারযোগ্য:
- JSR-330 DI স্পেসিফিকেশনটি Java SE এবং Java EE উভয় পরিবেশেই কাজ করতে সক্ষম। এটি Java অ্যাপ্লিকেশন উন্নয়নকে সহজ এবং সুবিধাজনক করে তোলে।
- DI কোড সহজতর করা:
- JSR-330 DI ব্যবহারের মাধ্যমে কোডের মধ্যে ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া সোজা করা যায় এবং কোডটি আরও মডুলার, টেস্টেবল, এবং রিডেবল হয়।
- বিদ্যমান ফ্রেমওয়ার্কের সাথে কাজ করা সহজ:
- JSR-330 একটি ওপেন স্ট্যান্ডার্ড হওয়ায় এটি বিদ্যমান বিভিন্ন ফ্রেমওয়ার্কের সাথে সুন্দরভাবে কাজ করতে পারে। উদাহরণস্বরূপ, Spring বা Guice সাপোর্ট করে JSR-330।
- ফিচারসমূহের একটি অভিন্ন সেট:
- JSR-330 একটি নির্দিষ্ট সেটের অ্যানোটেশন (যেমন
@Inject,@Named,@Singleton) সরবরাহ করে, যা অন্য DI ফ্রেমওয়ার্কে সাধারণভাবে ব্যবহার হতে পারে, ফলে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
- JSR-330 একটি নির্দিষ্ট সেটের অ্যানোটেশন (যেমন
- সক্ষমতা এবং স্কেলেবিলিটি:
- JSR-330 একটি খুবই কার্যকর পদ্ধতি সরবরাহ করে ডিপেনডেন্সি ইনজেকশন করতে যা বড় আর্কিটেকচার এবং স্কেলেবল সিস্টেমের জন্য উপযুক্ত।
JSR-330 এর সাথে Guice এর সম্পর্ক
Guice একটি JSR-330 কমপ্লায়েন্ট DI ফ্রেমওয়ার্ক, এর মানে হচ্ছে Guice JSR-330 এর স্পেসিফিকেশন অনুসরণ করে। Guice এর মাধ্যমে আপনি @Inject, @Named, এবং @Singleton অ্যানোটেশন ব্যবহার করে ডিপেনডেন্সি ইনজেকশন করতে পারবেন, যা JSR-330 এর অংশ।
Guice এবং JSR-330 এর মধ্যে সম্পর্কের সুবিধা হলো:
- Portability: Guice ব্যবহারকারী JSR-330 এর অ্যানোটেশন সাপোর্ট করায়, একই কোড অন্য JSR-330 কমপ্লায়েন্ট DI কনটেইনারেও ব্যবহার করা যেতে পারে।
- Interoperability: JSR-330 compliant ফ্রেমওয়ার্কগুলো একে অপরের সাথে ইন্টিগ্রেট করার জন্য উপযুক্ত, তাই Guice এর ব্যবহারকারীরা Spring বা CDI এর সাথেও সহজে ইন্টিগ্রেট করতে পারে।
উদাহরণ: JSR-330 এর সাথে Dependency Injection (DI) ব্যবহার
import javax.inject.Inject;
import javax.inject.Singleton;
public class Service {
private final Repository repository;
// Constructor Injection using @Inject
@Inject
public Service(Repository repository) {
this.repository = repository;
}
public void execute() {
repository.save();
}
}
@Singleton
public class RepositoryImpl implements Repository {
@Override
public void save() {
System.out.println("Data saved!");
}
}
Module Configuration (Guice Example)
import com.google.inject.AbstractModule;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(Repository.class).to(RepositoryImpl.class);
}
}
Main Application (Using JSR-330 Annotations)
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AppModule());
Service service = injector.getInstance(Service.class);
service.execute(); // Calls Repository's save method
}
}
এখানে, @Inject এবং @Singleton ব্যবহার করা হয়েছে, যা JSR-330 স্পেসিফিকেশন অনুযায়ী Guice এর মধ্যে ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া চালায়।
JSR-330 একটি অত্যন্ত গুরুত্বপূর্ণ স্পেসিফিকেশন যা Java-তে Dependency Injection (DI) ব্যবহারে একটি স্ট্যান্ডার্ড পদ্ধতি প্রদান করে। এটি কোডের মডুলারিটি, পুনঃব্যবহারযোগ্যতা এবং টেস্টযোগ্যতা উন্নত করে, এবং বিভিন্ন DI কনটেইনারের মধ্যে ইন্টারঅপারেবিলিটি ও পোর্টেবিলিটি নিশ্চিত করে। Guice এর মতো DI ফ্রেমওয়ার্ক JSR-330 অনুসরণ করে, যা ডেভেলপারদের DI-এর শক্তিশালী ও সমন্বিত ব্যবহার নিশ্চিত করে।
Read more