Dependency Injection (DI) এবং Enterprise JavaBeans (EJB) দুইটি গুরুত্বপূর্ণ প্রযুক্তি, যা Java EE (Enterprise Edition) প্ল্যাটফর্মে ব্যবহৃত হয়। DI এবং EJB একে অপরের সাথে ইন্টিগ্রেটেডভাবে কাজ করতে পারে, বিশেষত EJB Container তে একটি Bean-এর নির্ভরশীলতাগুলি ইনজেক্ট করার জন্য। Dependency Injection হল একটি ডিজাইন প্যাটার্ন, যা আপনাকে একাধিক ক্লাসের মধ্যে নির্ভরশীলতাগুলি ম্যানেজ করতে সাহায্য করে, এবং EJB হল একটি বিশেষ ধরনের Java Bean যা বিশেষভাবে ব্যবসায়িক লজিকের জন্য ব্যবহৃত হয়।
এখানে EJB-এ Dependency Injection (DI) ব্যবহারের সাথে সম্পর্কিত মূল ধারণা এবং উদাহরণ বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
1. Dependency Injection (DI) এর ধারণা
Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা আপনাকে আপনার ক্লাসের নির্ভরশীলতাগুলি (dependencies) স্বয়ংক্রিয়ভাবে ইনজেক্ট (inject) করতে দেয়, অর্থাৎ, নির্ভরশীলতা ক্লাসের কনস্ট্রাকটর, ফিল্ড বা মেথডের মাধ্যমে ইনজেক্ট করা হয়। এটি "Inversion of Control" (IoC) এর একটি রূপ, যেখানে একটি ক্লাস তার নির্ভরশীলতাগুলি সরাসরি তৈরি না করে, বরং এগুলি বাহ্যিকভাবে সরবরাহ করা হয়।
DI এর প্রধান উদ্দেশ্য হল:
- Loose Coupling: কোডের মধ্যে সম্পর্কের স্তর কমানো।
- Testability: কোডটি সহজে টেস্ট করা যায় কারণ নির্ভরশীলতাগুলি সহজেই ইনজেক্ট করা যেতে পারে।
- Maintainability: নির্ভরশীলতা এবং ক্লাসের মধ্যে সম্পর্ক পরিষ্কার এবং নমনীয় হয়।
2. EJB-এ Dependency Injection
EJB কন্টেইনার Dependency Injection-এর সুবিধা সরবরাহ করে, যেখানে নির্ভরশীলতাগুলি ক্লায়েন্ট অথবা সার্ভিসের মধ্যে স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়। EJB কন্টেইনার নির্ভরশীলতাগুলি ক্লাসে ইনজেক্ট করার জন্য @EJB, @Inject, অথবা @Resource অ্যানোটেশন ব্যবহার করতে পারে।
a) @EJB Annotation
@EJB অ্যানোটেশনটি EJB কম্পোনেন্ট ইনজেক্ট করার জন্য ব্যবহৃত হয়। এটি সাধারণত Stateless, Stateful, অথবা Singleton Session Bean-এর ক্ষেত্রে ব্যবহৃত হয়।
উদাহরণ:
- Stateless Session Bean:
import javax.ejb.Stateless;
@Stateless
public class CalculatorBean {
public int add(int a, int b) {
return a + b;
}
}
- EJB Client (Dependency Injection with @EJB):
import javax.ejb.EJB;
public class CalculatorClient {
@EJB // Dependency Injection of EJB
private static CalculatorBean calculatorBean;
public static void main(String[] args) {
// Accessing the injected bean
int result = calculatorBean.add(10, 20);
System.out.println("Result: " + result);
}
}
এখানে, @EJB অ্যানোটেশন ব্যবহার করে CalculatorBean কে ইনজেক্ট করা হয়েছে, এবং ক্লায়েন্টে এটি ব্যবহার করা হয়েছে। EJB কন্টেইনার CalculatorBean এর একটি ইনস্ট্যান্স প্রদান করবে ক্লায়েন্টকে।
b) @Inject Annotation (CDI)
@Inject হল Contexts and Dependency Injection (CDI) থেকে আসা একটি অ্যানোটেশন, যা EJB কন্টেইনারের বাইরেও অন্যান্য ধরনের অবজেক্টে ইনজেকশন করার জন্য ব্যবহার করা হয়। এটি অধিকতর সাধারণ এবং নমনীয় ইঞ্জেকশন প্রদান করে, যেমন ম্যানেজড বীন (Managed Beans) এবং অন্যান্য অবজেক্টগুলির জন্য।
উদাহরণ:
- Managed Bean (CDI Bean):
import javax.inject.Named;
@Named
public class MessageService {
public String getMessage() {
return "Hello from MessageService!";
}
}
- EJB Client (Using @Inject):
import javax.inject.Inject;
public class MessageClient {
@Inject // CDI Injection of Managed Bean
private static MessageService messageService;
public static void main(String[] args) {
// Accessing the injected bean
System.out.println(messageService.getMessage());
}
}
এখানে, @Inject ব্যবহার করা হয়েছে MessageService Bean-কে ইনজেক্ট করার জন্য। CDI কন্টেইনার স্বয়ংক্রিয়ভাবে MessageService ইনস্ট্যান্স ইনজেক্ট করবে ক্লায়েন্টে।
3. Resource Injection
EJB কন্টেইনার @Resource অ্যানোটেশনও সরবরাহ করে, যা বিভিন্ন সিস্টেম রিসোর্স যেমন ডেটাবেস কনেকশন, মেসেজিং সার্ভিস, ইত্যাদি ইনজেক্ট করতে ব্যবহৃত হয়।
উদাহরণ:
import javax.annotation.Resource;
import javax.sql.DataSource;
public class DataSourceClient {
@Resource(name = "jdbc/myDataSource")
private static DataSource dataSource;
public static void main(String[] args) {
try {
System.out.println("DataSource: " + dataSource);
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, @Resource অ্যানোটেশন ব্যবহার করে DataSource রিসোর্স ইনজেক্ট করা হয়েছে। EJB কন্টেইনার এটি ইনস্ট্যান্সিয়েট করে এবং ক্লায়েন্টে সরবরাহ করে।
4. EJB এবং DI এর সুবিধা
- Loose Coupling: EJB এবং ক্লায়েন্টের মধ্যে শক্তিশালী সম্পর্ক না থাকার ফলে কোড আরও নমনীয় হয় এবং পরিবর্তন করা সহজ হয়।
- Testability: Dependency Injection ব্যবহার করে, ক্লায়েন্টের জন্য নির্ভরশীলতাগুলি সহজেই মক বা স্টাব করা যেতে পারে, যা টেস্টিংকে সহজ করে তোলে।
- Maintainability: কোডের নির্ভরশীলতা ম্যানেজমেন্ট সহজ হয়ে ওঠে, কারণ Dependency Injection-এর মাধ্যমে আপনি সরাসরি ইনস্ট্যান্স তৈরি না করে বিভিন্ন ক্লাসের মধ্যে সম্পর্ক তৈরি করতে পারেন।
5. EJB এবং DI এর সমস্যা
- Configuration Complexity: Complex Dependency Injection configurations sometimes require more effort in terms of setup, particularly in large projects.
- Potential Performance Overhead: While DI promotes loose coupling and flexibility, there could be some performance overhead due to reflection and dependency resolution in certain cases.
EJB এবং Dependency Injection (DI) একে অপরের সাথে অত্যন্ত কার্যকরভাবে কাজ করে। EJB কন্টেইনার DI ব্যবহার করে EJB Beans কে ক্লায়েন্টে ইনজেক্ট করতে সহায়ক হয়। @EJB, @Inject, এবং @Resource অ্যানোটেশনগুলির মাধ্যমে DI ক্লায়েন্টে সরবরাহ করা হয়, যা কোডের নমনীয়তা, টেস্টিং, এবং মেইনটেনেবিলিটি উন্নত করে। EJB এবং DI একত্রে ব্যবহারের মাধ্যমে আমরা loose coupling, modularity, এবং ease of testing নিশ্চিত করতে পারি।
Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা কোডের মধ্যে ডিপেন্ডেন্সি বা নির্ভরশীলতা ম্যানেজ করতে সাহায্য করে। এটি মূলত Inversion of Control (IoC) এর একটি অংশ এবং প্রোগ্রামিং এর একটি গুরুত্বপূর্ণ কৌশল, বিশেষত বড় এবং জটিল সিস্টেমে। DI এর মাধ্যমে, ক্লাসগুলো তাদের নির্ভরশীলতাগুলি বাইরের উৎস (যেমন, কনফিগারেশন ফাইল বা ইন্সট্যান্স) থেকে ইনজেক্ট (সরবরাহ) করে নেয়, তার পরিবর্তে নিজে নিজে সেই নির্ভরশীলতাগুলোর ইনস্ট্যান্স তৈরি করার পরিবর্তে।
Dependency Injection (DI) এর ধারণা
Dependency Injection এর মাধ্যমে, একটি ক্লাস তার নির্ভরশীলতা (dependencies) বাইরের কোন সোর্স থেকে পায়, বদলে ক্লাস নিজে তা তৈরি করে না। এটি মূলত কোডের লুজ কপ্লিং (loose coupling) বৃদ্ধি করে, যাতে কোডটি আরো মডুলার, রিইউজেবল এবং টেস্টেবল হয়।
DI এর মূল উপাদান
DI সাধারণত তিনটি প্রধান উপাদান বা কম্পোনেন্ট ব্যবহার করে কাজ করে:
- Client: যে ক্লাসটি নির্ভরশীলতা পায়।
- Service: যে ক্লাসটি নির্ভরশীলতাগুলি সরবরাহ করে (অথবা যেটি বাইরের ডিপেন্ডেন্সি সরবরাহ করে)।
- Injector: যে উপাদানটি নির্ভরশীলতা ইনজেক্ট করে। এটি নির্ধারণ করে কোন ক্লাস কোন ডিপেন্ডেন্সি নিবে।
DI এর প্রধান সুবিধা:
- লুজ কপ্লিং: কোডের মধ্যে নির্ভরশীলতা কমাতে সাহায্য করে, ফলে কোডটি আরও নমনীয় এবং পরিবর্তনযোগ্য হয়।
- টেস্টিং সহজ করা: যেহেতু নির্ভরশীলতাগুলি বাইরের উৎস থেকে ইনজেক্ট করা হয়, তাই ইউনিট টেস্টিং সহজ হয়। আপনি সহজেই মক (mock) বা স্টাব (stub) ব্যবহার করে পরীক্ষণ করতে পারেন।
- রিইউজেবিলিটি: একাধিক ক্লাস একই ডিপেন্ডেন্সি শেয়ার করতে পারে, ফলে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
- ফ্লেক্সিবিলিটি: ডিপেন্ডেন্সির পরিবর্তন বা কনফিগারেশন সহজভাবে করা যায়।
DI এর ৩টি পদ্ধতি
DI সাধারণত তিনটি প্রধান পদ্ধতিতে বাস্তবায়িত করা যায়:
- Constructor Injection: ডিপেন্ডেন্সি ইনজেক্ট করা হয় ক্লাসের কনস্ট্রাক্টরের মাধ্যমে।
- Setter Injection: ডিপেন্ডেন্সি ইনজেক্ট করা হয় ক্লাসের সিটার মেথডের মাধ্যমে।
- Interface Injection: ডিপেন্ডেন্সি ইনজেক্ট করা হয় ইন্টারফেসের মাধ্যমে, যেখানে ক্লাসটি ওই ইন্টারফেসের মেথডে ডিপেন্ড করে।
উদাহরণ:
১. Constructor Injection (কনস্ট্রাক্টর ইনজেকশন)
// Service Class
public class Service {
public void execute() {
System.out.println("Service Executed");
}
}
// Client Class that depends on Service
public class Client {
private Service service;
// Constructor Injection
public Client(Service service) {
this.service = service;
}
public void start() {
service.execute();
}
}
// Main class to inject dependency
public class Main {
public static void main(String[] args) {
Service service = new Service();
Client client = new Client(service); // Dependency is injected here
client.start();
}
}
এখানে Client ক্লাসটি Service ক্লাসের উপর নির্ভরশীল। Service ক্লাসটি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়েছে।
২. Setter Injection (সিটার ইনজেকশন)
public class Service {
public void execute() {
System.out.println("Service Executed");
}
}
public class Client {
private Service service;
// Setter Injection
public void setService(Service service) {
this.service = service;
}
public void start() {
service.execute();
}
}
public class Main {
public static void main(String[] args) {
Service service = new Service();
Client client = new Client();
client.setService(service); // Dependency is injected through setter
client.start();
}
}
এখানে Service ক্লাসটি Client ক্লাসের setService মেথডের মাধ্যমে ইনজেক্ট করা হয়েছে।
DI Frameworks:
বিভিন্ন DI frameworks আছে যা DI প্যাটার্নের সাহায্যে ডিপেন্ডেন্সি ইনজেকশন সহজ করে তোলে। কিছু জনপ্রিয় DI frameworks হল:
- Spring Framework: Spring একটি জনপ্রিয় DI ফ্রেমওয়ার্ক যা DI প্যাটার্নের উপর ভিত্তি করে কাজ করে। এটি ক্লাসগুলোর ডিপেন্ডেন্সি অটোমেটিকভাবে ইনজেক্ট করতে সক্ষম।
- Google Guice: একটি ওপেন সোর্স DI ফ্রেমওয়ার্ক যা সহজ এবং কমপ্যাক্ট।
- CDI (Contexts and Dependency Injection): Java EE প্ল্যাটফর্মের অংশ যা DI প্যাটার্ন প্রয়োগ করে।
সংক্ষেপে:
Dependency Injection (DI) হল একটি প্রোগ্রামিং কৌশল যা ক্লাসের নির্ভরশীলতাগুলি বাইরের উৎস থেকে ইনজেক্ট করে, যাতে কোডের লোজ কপ্লিং হয়, টেস্টিং সহজ হয় এবং রিইউজেবিলিটি বৃদ্ধি পায়। এটি ক্লাসগুলির মধ্যে সম্পর্ককে কমিয়ে দেয় এবং কোডের মান উন্নত করে।
Eclipse IDE-এ EJB (Enterprise JavaBeans)-এ @EJB এবং @Inject ব্যবহার দুইটি ভিন্ন ইনজেকশন মেকানিজম। যদিও উভয়ই Java EE (Jakarta EE) অ্যাপ্লিকেশনে ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়, তবে তাদের ব্যবহার এবং কার্যকরীতা কিছুটা আলাদা। নিচে @EJB এবং @Inject এর মধ্যে পার্থক্য এবং তাদের ব্যবহার নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
1. @EJB এর ব্যবহার
@EJB হল একটি Enterprise JavaBeans (EJB) এর ডিপেনডেন্সি ইনজেকশন অ্যানোটেশন। এটি একমাত্র EJB টাইপের ক্লাসের জন্য ব্যবহৃত হয় এবং EJB Bean কে ক্লায়েন্টে ইনজেক্ট করতে সাহায্য করে। সাধারণত Session Beans বা Message-Driven Beans এর জন্য @EJB ব্যবহার করা হয়। EJB Beans সার্ভারের ভিতরে রান করে এবং তাদের ইনস্ট্যান্স তৈরি এবং পরিচালনা করা হয় EJB Container দ্বারা।
@EJB এর বৈশিষ্ট্য:
- EJB-কে Inject করতে:
@EJBব্যবহার করে EJB ক্লাসের ইনস্ট্যান্স ইনজেক্ট করা হয়। - Container Managed Transactions (CMT):
@EJBদ্বারা ইনজেক্ট করা Bean ক্লাসগুলির ট্রানজেকশন সিস্টেম EJB Container ম্যানেজ করে।
@EJB ব্যবহার করার উদাহরণ:
import javax.ejb.EJB;
import javax.ejb.Stateless;
@Stateless
public class BusinessLogicBean {
@EJB
private DataServiceBean dataService; // Injecting an EJB
public String getData() {
return dataService.fetchData(); // Calling an EJB method
}
}
এখানে, @EJB অ্যানোটেশনটি DataServiceBean-কে inject করে BusinessLogicBean এর মধ্যে, যা EJB Bean-কে ক্লায়েন্টে ব্যবহার করতে সহায়তা করে। এই মেথডটি EJB Container দ্বারা স্বয়ংক্রিয়ভাবে ইনস্ট্যান্স তৈরি এবং পরিচালিত হয়।
@EJB-এর ক্লাস উদাহরণ:
import javax.ejb.Stateless;
@Stateless
public class DataServiceBean {
public String fetchData() {
return "Fetched Data from Database";
}
}
এই উদাহরণে, BusinessLogicBean ক্লাসে DataServiceBean কে inject করা হচ্ছে এবং fetchData() মেথডটি ব্যবহার করা হচ্ছে।
2. @Inject এর ব্যবহার
@Inject হল Java Context and Dependency Injection (CDI) এর অংশ এবং এটি EJB Beans ছাড়াও অন্য যে কোনো ক্লাসে ডিপেনডেন্সি ইনজেকশন করার জন্য ব্যবহার করা যেতে পারে। @Inject ব্যবহার করে আপনি CDI beans (যেগুলি @Named বা অন্যান্য CDI-সাপোর্টেড অ্যানোটেশন দ্বারা চিহ্নিত) ইনজেক্ট করতে পারেন।
@Inject এর বৈশিষ্ট্য:
- CDI Beans-কে Inject করতে:
@Injectঅ্যানোটেশনটি CDI Beans ইনজেক্ট করতে ব্যবহৃত হয়, যা সাধারণত POJOs (Plain Old Java Objects)। - Flexible and Lightweight: CDI Beans সাধারণত lightweight এবং flexible হয় এবং সেগুলি container দ্বারা ম্যানেজ করা হয়।
@Inject ব্যবহার করার উদাহরণ:
import javax.inject.Inject;
public class ServiceConsumer {
@Inject
private DataService dataService; // Injecting a CDI Bean
public String getData() {
return dataService.fetchData();
}
}
এখানে, @Inject অ্যানোটেশনটি DataService নামক CDI Bean-কে ইনজেক্ট করছে। এটি একটি POJO (Plain Old Java Object) হতে পারে এবং সাধারণত EJB Bean নয়। DataService কে CDI context থেকে ইনজেক্ট করা হচ্ছে।
@Inject এর CDI Bean উদাহরণ:
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named
@RequestScoped
public class DataService {
public String fetchData() {
return "Fetched data from Service Layer";
}
}
এখানে, DataService একটি CDI Bean, যেটি @Named এবং @RequestScoped অ্যানোটেশন দ্বারা চিহ্নিত। এটি একটি lightweight POJO যা ক্লাসে @Inject এর মাধ্যমে ইনজেক্ট করা হয়েছে।
3. @EJB vs @Inject – পার্থক্য
| Feature | @EJB | @Inject |
|---|---|---|
| Context | EJB Container | CDI Context (Java EE) |
| Bean Type | EJB Beans (Stateful/Stateless) | CDI Beans (POJOs or other types) |
| Transactions | Container Managed Transactions (CMT) | Transactions are managed separately (optional) |
| Scope | Typically bound to EJB Scope | More flexible (request, session, etc.) |
| Use Case | Enterprise Applications (EJBs) | Lightweight, Flexible Java Beans |
| Dependency | Only EJB Beans (e.g., Stateless/Stateful) | Any Java object that conforms to CDI |
4. When to Use @EJB and @Inject
Use @EJB When:
- You are working within the Java EE (Jakarta EE) environment, and you need to inject EJB Beans (e.g., Stateless Session Beans, Stateful Session Beans, or Message-Driven Beans).
- You need Container-Managed Transactions and want the EJB container to manage the lifecycle, transactions, and security of the beans.
- You require EJB features like Concurrency Management or Security Context.
Use @Inject When:
- You are working with Java EE or Jakarta EE applications and you want to inject CDI Beans (which are often lighter than EJBs).
- You prefer to work with POJOs (Plain Old Java Objects) that don't require the full EJB specification.
- You need more flexibility and the beans are not required to be EJB but can be managed using CDI scopes like @RequestScoped, @SessionScoped, or @ApplicationScoped.
- You want a simpler dependency injection model for more lightweight applications.
Both @EJB and @Inject provide mechanisms for dependency injection, but they are used in different contexts:
@EJBis specifically designed for injecting Enterprise JavaBeans (EJB), providing features like transaction management, security, and state management in enterprise-level Java applications.@Inject, on the other hand, is a part of the CDI (Contexts and Dependency Injection) specification and provides more lightweight, flexible dependency injection for POJOs and CDI beans, without the overhead and complexities associated with EJBs.
In modern enterprise applications, @Inject is generally used for simpler dependency injection with CDI beans, while @EJB is typically reserved for more complex, enterprise-level applications requiring EJB functionality.
CDI (Contexts and Dependency Injection) হল একটি আধুনিক এবং শক্তিশালী dependency injection প্রযুক্তি যা Java EE (এখন Jakarta EE) অ্যাপ্লিকেশন ডেভেলপমেন্টে ব্যবহৃত হয়। CDI এর মাধ্যমে ডেভেলপাররা ক্লাসের মধ্যে নির্ভরশীলতা (dependencies) সঠিকভাবে ইনজেক্ট করতে পারে, যা কোডের মডুলারিটি, রিডেবিলিটি, এবং টেস্টিং সহজ করে তোলে।
EJB (Enterprise JavaBeans) হল Java EE এর অংশ যা একাধিক ক্লায়েন্টের জন্য স্কেলেবল এবং ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। CDI এবং EJB একসাথে ব্যবহার করা যায়, যেখানে CDI নির্ভরশীলতা ইনজেকশন (dependency injection) এবং EJB ব্যবসায়িক লজিক (business logic) সরবরাহ করে।
এখানে আমরা আলোচনা করব কিভাবে EJB এর মধ্যে CDI (Contexts and Dependency Injection) ব্যবহার করা যায়।
CDI এবং EJB এর মধ্যে পার্থক্য এবং সম্পর্ক
- EJB (Enterprise JavaBeans): EJB হল একটি Java EE কম্পোনেন্ট আর্কিটেকচার, যা আপনার অ্যাপ্লিকেশনকে টেকসই, স্কেলেবল এবং ট্রানজেকশনাল অবস্থা প্রদান করে। EJB তে ট্রানজেকশন ম্যানেজমেন্ট, সিকিউরিটি, এবং কনকারেন্সি ম্যানেজমেন্ট থাকে, যা কোডের জন্য স্বয়ংক্রিয়ভাবে পরিচালিত হয়।
- CDI (Contexts and Dependency Injection): CDI হল Java EE এর একটি প্রযুক্তি যা ডিপেনডেন্সি ইনজেকশন এবং ক্লাসগুলির মধ্যে নির্ভরশীলতা সম্পর্কিত সমস্যাগুলি সমাধান করে। এটি আপনার কোডের মডুলারিটি, রিডেবিলিটি এবং টেস্টেবিলিটি উন্নত করে।
CDI এবং EJB একত্রে ব্যবহার করলে আপনার অ্যাপ্লিকেশন আরও ফ্লেক্সিবল এবং সেন্ট্রালাইজড হতে পারে। CDI দিয়ে আপনি EJB কম্পোনেন্টে নির্ভরশীলতা ইনজেক্ট করতে পারবেন, যা কোডের সম্পাদনা এবং রক্ষণাবেক্ষণ সহজ করে।
CDI ব্যবহার করে EJB কম্পোনেন্টে ইনজেকশন
CDI মাধ্যমে আপনি EJB এর মধ্যে dependency injection করতে পারেন। এটি ক্লাসগুলির মধ্যে নির্ভরশীলতা ম্যানেজ করতে সহায়ক। সাধারণত, CDI তে @Inject অ্যানোটেশন ব্যবহার করা হয়, যার মাধ্যমে কোন EJB বা অন্যান্য কম্পোনেন্টে ডিপেনডেন্সি ইনজেক্ট করা হয়।
EJB কম্পোনেন্টে CDI ইনজেকশন এর উদাহরণ:
Step 1: EJB (Stateful Session Bean) তৈরি করা
package com.example.ejb;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
@Stateful
@RequestScoped
public class ShoppingCartBean {
private int itemCount = 0;
public void addItem() {
itemCount++;
}
public int getItemCount() {
return itemCount;
}
}
এখানে, ShoppingCartBean একটি Stateful Session Bean, যা একটি সাধারণ শপিং কার্টের ফিচার সমর্থন করে।
Step 2: CDI Managed Bean (Service Class)
package com.example.service;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class ShoppingCartService {
// Injecting the EJB using CDI
@Inject
private ShoppingCartBean shoppingCartBean;
public void addItemToCart() {
shoppingCartBean.addItem();
}
public int getItemCount() {
return shoppingCartBean.getItemCount();
}
}
এখানে, ShoppingCartService একটি CDI-managed bean এবং ShoppingCartBean এর সাথে @Inject অ্যানোটেশন ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করা হয়েছে। ShoppingCartBean তে থাকা লজিক ShoppingCartService এর মাধ্যমে ব্যবহৃত হবে।
Step 3: Client (EJB and CDI Access)
package com.example.client;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.example.service.ShoppingCartService;
public class Client {
public static void main(String[] args) {
try {
// JNDI Lookup to access the CDI bean
Context context = new InitialContext();
ShoppingCartService shoppingCartService = (ShoppingCartService) context.lookup("java:global/myapp/ShoppingCartService");
// Using the service to interact with EJB
shoppingCartService.addItemToCart();
System.out.println("Item count in cart: " + shoppingCartService.getItemCount());
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, Client ক্লাসটি ShoppingCartService ক্লাসের ইনস্ট্যান্স পাওয়ার জন্য JNDI lookup ব্যবহার করেছে, এবং এরপর ShoppingCartService এর মাধ্যমে ShoppingCartBean এর মেথড addItemToCart কল করা হয়েছে।
CDI ইনজেকশন এবং EJB এর বৈশিষ্ট্য:
- Decoupling and Flexibility (ডিকাউপ্লিং এবং নমনীয়তা):
- CDI মাধ্যমে EJB কম্পোনেন্টে ডিপেনডেন্সি ইনজেকশন করলে আপনি ম্যানুয়ালি অবজেক্ট তৈরি না করে সহজেই নির্ভরশীলতা ইনজেক্ট করতে পারবেন, যা কোডকে আরো পরিষ্কার এবং নমনীয় করে তোলে।
- Lifecycle Management (লাইফসাইকেল ম্যানেজমেন্ট):
- CDI এর মাধ্যমে ইনজেক্ট করা কম্পোনেন্টের লাইফসাইকেল (যেমন RequestScoped, SessionScoped, ApplicationScoped) কন্ট্রোল করা সহজ হয়। এভাবে, আপনি EJB কন্টেইনারের ম্যানেজড লাইফসাইকেল এবং CDI এর সুবিধা একসাথে ব্যবহার করতে পারেন।
- Cross-cutting Concerns (ক্রস-কাটিং কনসার্নস):
- CDI এর মাধ্যমে interceptors, decorators, এবং aspects যোগ করা যায়, যা EJB কম্পোনেন্টগুলির ক্রস-কাটিং কনসার্নস যেমন লগিং, ট্রানজেকশন ম্যানেজমেন্ট এবং সিকিউরিটি নিয়ে কাজ করতে পারে।
- Loose Coupling (লুজ কাপলিং):
- CDI এর মাধ্যমে ডিপেনডেন্সি ইনজেকশন করলে আপনি আপনার EJB এবং অন্যান্য ক্লাসের মধ্যে শক্তিশালী নির্ভরশীলতার পরিবর্তে loose coupling তৈরি করতে পারেন, যা অ্যাপ্লিকেশনটিকে সহজে পরবর্তী সময়ে পরিবর্তন বা এক্সটেনশন করার সুযোগ দেয়।
EJB এর মধ্যে CDI ব্যবহার করার সুবিধা:
- শক্তিশালী Dependency Management: CDI এবং EJB একসাথে ব্যবহৃত হলে ডিপেনডেন্সি ইনজেকশন এবং টেস্টিং আরও সহজ হয়।
- অবজেক্ট ম্যানেজমেন্ট: CDI কন্টেইনারের মাধ্যমে আপনি অবজেক্টের লাইফসাইকেল খুব সহজে ম্যানেজ করতে পারেন।
- টেস্টিং: CDI এবং EJB একত্রে ব্যবহার করলে আপনি কমপ্লেক্স ক্লাসগুলির টেস্টিং সহজভাবে করতে পারবেন, কারণ EJB এর সাথে আপনার ব্যবসায়িক লজিকের ইনজেকশন সহজ হবে।
- প্রদর্শন ক্ষমতা: EJB এর সাথে CDI ব্যবহার করার মাধ্যমে আপনার অ্যাপ্লিকেশন আরও স্কেলেবল এবং নমনীয় হতে পারে।
সারাংশ:
CDI (Contexts and Dependency Injection) হল Java EE বা Jakarta EE এর একটি শক্তিশালী ফিচার, যা EJB (Enterprise JavaBeans) এর সাথে একত্রে ব্যবহৃত হলে কোডের মডুলারিটি এবং রিডেবিলিটি বৃদ্ধি পায়। CDI দিয়ে আপনি EJB কম্পোনেন্টে dependency injection করতে পারেন, যা কোডের অবস্থা এবং কার্যকারিতা আরও সহজ করে তোলে। এটি EJB এবং অন্যান্য Java EE প্রযুক্তির সাথে একত্রে ব্যবহারের মাধ্যমে একটি শক্তিশালী, স্কেলেবল এবং সুগঠিত অ্যাপ্লিকেশন ডেভেলপ করতে সহায়তা করে।
EJB (Enterprise JavaBeans) তে @Resource অ্যানোটেশনটি ব্যবহৃত হয় বিভিন্ন ধরনের রিসোর্স যেমন DataSource, ConnectionFactory, EJB Beans, Environment Entries, JMS Queues, Mail Sessions ইত্যাদি ইঞ্জেক্ট করার জন্য। @Resource অ্যানোটেশনটি Dependency Injection (DI) এর মাধ্যমে রিসোর্সগুলিকে EJB ক্লাসের মধ্যে ইনজেক্ট করে, যা কোডকে আরও পরিষ্কার এবং সহজবোধ্য করে তোলে।
EJB তে @Resource ব্যবহার করা মানে হল যে, আপনি আপনার EJB ক্লাসের মধ্যে নির্দিষ্ট রিসোর্স সরাসরি ইনজেক্ট করতে পারবেন এবং এগুলির মান সেট করার জন্য কোন নির্দিষ্ট কনফিগারেশন বা কোডিং করার প্রয়োজন নেই।
@Resource Annotation এর ব্যবহার:
@Resource অ্যানোটেশনটি একটি Java EE স্পেসিফিকেশন যা EJB বা সাধারণভাবে Java EE অ্যাপ্লিকেশনগুলিতে বিভিন্ন রিসোর্সের ইনজেকশন পরিচালনা করে। আপনি @Resource ব্যবহার করে অনেক ধরনের রিসোর্স ইনজেক্ট করতে পারেন, যেমন:
- DataSource (ডেটাবেস কানেকশন)
- EJB Beans
- JMS (Java Message Service)
- Mail Sessions
- Context Parameters
@Resource Annotation Syntax:
@Resource(name="resource-name")
private ResourceType resourceName;
- name: রিসোর্সের নাম।
- resourceType: রিসোর্সের ডাটা টাইপ (যেমন
DataSource,ConnectionFactoryইত্যাদি)।
EJB তে @Resource Annotation এর উদাহরণ
1. DataSource (ডেটাবেস কানেকশন) ইনজেক্ট করা
ধরা যাক, আপনি একটি DataSource রিসোর্স ইনজেক্ট করতে চান, যা ডাটাবেসের সাথে যোগাযোগ করার জন্য ব্যবহৃত হবে। আপনি @Resource অ্যানোটেশন ব্যবহার করে এই কাজটি করতে পারেন।
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@Stateless
public class CustomerService {
// @Resource ব্যবহার করে DataSource ইনজেক্ট করা
@Resource(name="jdbc/myDataSource")
private DataSource dataSource;
public void getCustomerData() {
try (Connection connection = dataSource.getConnection()) {
// ডেটাবেসে সংযোগ এবং কার্যক্রম
System.out.println("Connected to the database!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
এখানে, @Resource অ্যানোটেশনটি DataSource রিসোর্স ইনজেক্ট করছে, যা ডেটাবেস কানেকশন পরিচালনা করবে। name প্যারামিটারটি JNDI (Java Naming and Directory Interface) লুকআপের জন্য ব্যবহৃত হয় এবং jdbc/myDataSource একটি পূর্বনির্ধারিত JNDI রিসোর্সের নাম।
2. JMS Queue (Java Message Service) ইনজেক্ট করা
আপনি যদি JMS Queue বা Topic ব্যবহার করতে চান, তাহলে @Resource অ্যানোটেশন দিয়ে সহজেই এটি ইনজেক্ট করতে পারেন।
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.jms.Queue;
import javax.jms.JMSContext;
import javax.jms.JMSProducer;
@Stateless
public class MessageSenderService {
// @Resource ব্যবহার করে JMS Queue ইনজেক্ট করা
@Resource(name="jms/myQueue")
private Queue myQueue;
@Resource
private JMSContext context;
public void sendMessage(String message) {
JMSProducer producer = context.createProducer();
producer.send(myQueue, message);
System.out.println("Message sent to queue: " + message);
}
}
এখানে, @Resource অ্যানোটেশনটি JMS Queue ইনজেক্ট করছে, যা মেসেজ পাঠানোর জন্য ব্যবহৃত হবে। JMSContext ইনজেক্ট করা হচ্ছে যা মেসেজ সেন্ড এবং রিসিভের জন্য ব্যবহৃত হবে।
3. Mail Session ইনজেক্ট করা
@Resource ব্যবহার করে আপনি Mail Session (ইমেল সেশন) ইনজেক্ট করতে পারেন, যা JavaMail API দিয়ে ইমেল পাঠানোর জন্য ব্যবহৃত হয়।
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.mail.Session;
@Stateless
public class EmailService {
// @Resource ব্যবহার করে Mail Session ইনজেক্ট করা
@Resource(name="mail/myMailSession")
private Session mailSession;
public void sendEmail(String to, String subject, String body) {
// ইমেল পাঠানোর কোড
System.out.println("Sending email to: " + to);
}
}
এখানে, @Resource অ্যানোটেশনটি Mail Session ইনজেক্ট করছে, যা JavaMail API ব্যবহারের জন্য প্রয়োজনীয় সেশন তৈরি করবে।
@Resource Annotation এর আরেকটি উদাহরণ:
4. EJB Beans ইনজেক্ট করা
আপনি যদি অন্য একটি EJB Bean ইনজেক্ট করতে চান, তবে @Resource অ্যানোটেশন ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি Stateless EJB ইনজেক্ট করা হচ্ছে:
import javax.ejb.Stateless;
import javax.ejb.EJB;
@Stateless
public class OrderService {
// @EJB ব্যবহার করে অন্য একটি EJB ইনজেক্ট করা
@EJB
private PaymentService paymentService;
public void processOrder(int orderId) {
// Order প্রক্রিয়া সম্পন্ন করা
paymentService.processPayment(orderId);
}
}
এখানে, @EJB অ্যানোটেশনটি PaymentService EJB ইনজেক্ট করছে, যা OrderService ক্লাসে ব্যবহৃত হচ্ছে।
@Resource এবং @EJB এর মধ্যে পার্থক্য:
- @Resource: এটি সাধারণভাবে Java EE রিসোর্স ইনজেকশন করতে ব্যবহৃত হয়, যেমন DataSource, JMS, MailSession, EJB Beans ইত্যাদি।
- @EJB: এটি শুধুমাত্র EJB Beans ইনজেকশন করার জন্য ব্যবহৃত হয়, এবং এটি সাধারণত অন্য EJB Beans (Stateless, Stateful) ডিপেনডেন্সি ইনজেক্ট করতে ব্যবহৃত হয়।
সারাংশ:
- @Resource অ্যানোটেশনটি EJB বা Java EE অ্যাপ্লিকেশনে বিভিন্ন ধরনের রিসোর্স ইনজেক্ট করতে ব্যবহৃত হয়, যেমন DataSource, JMS Queue, Mail Sessions, এবং EJB Beans।
- Dependency Injection এর মাধ্যমে রিসোর্সগুলো ইনজেক্ট করা হয়, যা কোডের কনফিগারেশন সহজ করে এবং অ্যাপ্লিকেশন ডেভেলপমেন্টে অনেক সুবিধা প্রদান করে।
- @Resource অ্যানোটেশনটি রিসোর্স ইনজেক্ট করার জন্য একটি সাধারণ এবং সরল উপায় প্রদান করে যা JNDI (Java Naming and Directory Interface) থেকে রিসোর্সকে লুকআপ এবং অ্যাক্সেস করতে সহায়ক।
Read more