Spring Dependency Injection (DI) কি?
Spring Dependency Injection (DI) হল স্প্রিং ফ্রেমওয়ার্কের একটি মৌলিক বৈশিষ্ট্য, যা অবজেক্টগুলোর মধ্যে ডিপেনডেন্সি (অন্য অবজেক্ট) ইনজেক্ট করতে সাহায্য করে। DI একটি Inversion of Control (IoC) প্যাটার্নের একটি বাস্তবায়ন। এর মাধ্যমে স্প্রিং কন্টেইনার অবজেক্টগুলো তৈরি এবং তাদের ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করে। এটি কোডকে আরও নমনীয় এবং টেস্টেবল করে তোলে।
স্প্রিং DI সাধারণত Constructor Injection, Setter Injection এবং Field Injection এর মাধ্যমে কাজ করে। এই পদ্ধতিগুলি দ্বারা স্প্রিং কন্টেইনার ক্লাসের ডিপেনডেন্সি ইনজেক্ট করে।
Spring DI এর প্রকার
- Constructor Injection: কনস্ট্রাকটর মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা হয়।
- Setter Injection: স্যাটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা হয়।
- Field Injection: সরাসরি ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করা হয়।
Spring DI এর ব্যবহার উদাহরণ
১. Constructor Injection উদাহরণ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
private Engine engine;
// Constructor Injection
@Autowired
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.run();
}
}
@Component
public class Engine {
public void run() {
System.out.println("Engine is running...");
}
}
এখানে, Car ক্লাসে Engine ক্লাসের ডিপেনডেন্সি কনস্ট্রাকটরের মাধ্যমে ইনজেক্ট করা হয়েছে।
২. Setter Injection উদাহরণ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
private Engine engine;
// Setter Injection
@Autowired
public void setEngine(Engine engine) {
this.engine = engine;
}
public void start() {
engine.run();
}
}
@Component
public class Engine {
public void run() {
System.out.println("Engine is running...");
}
}
এখানে, Engine অবজেক্টটি setEngine মেথডের মাধ্যমে ইনজেক্ট করা হয়েছে।
Configuration Properties কি?
Configuration Properties স্প্রিং ফ্রেমওয়ার্কে একটি উপায় যা স্প্রিং অ্যাপ্লিকেশনের কনফিগারেশন প্রপার্টি বা সেটিংস ফাইল থেকে ডেটা সংগ্রহ করতে সহায়ক। স্প্রিং কনফিগারেশন প্রপার্টি ফাইল, যেমন application.properties বা application.yml, ব্যবহার করে বিভিন্ন কনফিগারেশন ভ্যালু ইনজেক্ট করা যায়।
স্প্রিং @ConfigurationProperties অ্যানোটেশন ব্যবহার করে কনফিগারেশন ফাইলের প্রপার্টি গুলি একটি বীন ক্লাসে ইনজেক্ট করা যেতে পারে।
Configuration Properties এর ব্যবহারের সুবিধা
- কনফিগারেশন ভ্যালুর কেন্দ্রীকরণ: সমস্ত কনফিগারেশন প্রপার্টি একটি একক ক্লাসে সংগঠিত থাকে।
- টাইপ সেফ ডেটা ম্যানেজমেন্ট: আপনি কনফিগারেশন প্রপার্টির মান সরাসরি একটি টাইপড ক্লাসে ইনজেক্ট করতে পারেন, যা ভুল কনফিগারেশন প্রপার্টি ব্যবহারের সম্ভাবনা কমায়।
Spring DI এবং Configuration Properties উদাহরণ
১. application.properties ফাইল সেটআপ
app.name=Spring DI Example
app.version=1.0.0
২. Configuration Properties ক্লাস
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
ব্যাখ্যা:
@ConfigurationProperties(prefix = "app"): স্প্রিং কনফিগারেশন প্রপার্টিapp.nameএবংapp.versionএর মানAppConfigক্লাসে ইনজেক্ট করে।- স্প্রিং
@Componentঅ্যানোটেশন ব্যবহার করে এই ক্লাসটি বীন হিসেবে স্প্রিং কন্টেইনারে রেজিস্টার করা হয়।
৩. স্প্রিং কনফিগারেশন ক্লাস (Java Config)
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(AppConfig.class)
public class AppConfigSetup {
}
৪. Spring Boot Application ক্লাস
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 SpringDIExampleApplication implements CommandLineRunner {
@Autowired
private AppConfig appConfig;
public static void main(String[] args) {
SpringApplication.run(SpringDIExampleApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("App Name: " + appConfig.getName());
System.out.println("App Version: " + appConfig.getVersion());
}
}
আউটপুট:
App Name: Spring DI Example
App Version: 1.0.0
এখানে, স্প্রিং কনফিগারেশন প্রপার্টি application.properties থেকে app.name এবং app.version এর মান AppConfig ক্লাসে ইনজেক্ট করা হয়েছে এবং Spring Boot অ্যাপ্লিকেশনটি রান করার সময় তা কনসোলে প্রদর্শিত হচ্ছে।
সারাংশ
Spring DI (Dependency Injection) স্প্রিং ফ্রেমওয়ার্কে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা অবজেক্টগুলির ডিপেনডেন্সি ইনজেক্ট করতে সহায়ক। Setter Injection পদ্ধতিতে স্প্রিং কন্টেইনার স্যাটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করে, যা কোডের নমনীয়তা এবং রক্ষণাবেক্ষণ সহজ করে তোলে। অন্যদিকে, Configuration Properties স্প্রিং ফ্রেমওয়ার্কে কনফিগারেশন ফাইল থেকে প্রপার্টি ভ্যালু ইনজেক্ট করার একটি শক্তিশালী উপায়, যা অ্যাপ্লিকেশন কনফিগারেশন পরিচালনা করতে সহজ করে তোলে। @ConfigurationProperties অ্যানোটেশন ব্যবহার করে স্প্রিং কনফিগারেশন প্রপার্টি গুলি একটি ক্লাসে ইনজেক্ট করা যেতে পারে, যা টাইপ সেফ ডেটা ম্যানেজমেন্ট নিশ্চিত করে।
@Value এবং @ConfigurationProperties এর ভূমিকা
Spring Framework ডিপেনডেন্সি ইনজেকশন (DI) পরিচালনা করতে দুটি গুরুত্বপূর্ণ অ্যানোটেশন প্রদান করে: @Value এবং @ConfigurationProperties। এই দুটি অ্যানোটেশন Spring Beans-এর প্রপার্টি ফাইল বা কনফিগারেশন ভ্যালু ইনজেক্ট করতে ব্যবহৃত হয়। এগুলি Spring Beans-এর জন্য কনফিগারেশন ভ্যালু সরবরাহের একটি নমনীয় এবং কার্যকর পদ্ধতি।
@Value: এটি Spring Bean-এ একক প্রপার্টি বা ভ্যালু ইনজেক্ট করার জন্য ব্যবহৃত হয়।@ConfigurationProperties: এটি গ্রুপড কনফিগারেশন ভ্যালু বা প্রপার্টি ফাইলের একাধিক ভ্যালু ইনজেক্ট করার জন্য ব্যবহৃত হয়।
@Value অ্যানোটেশন ব্যবহার করে DI পরিচালনা
@Value অ্যানোটেশন ব্যবহার করে আপনি Spring Beans-এর মধ্যে একটি নির্দিষ্ট প্রপার্টি বা কনফিগারেশন ফাইলের ভ্যালু ইনজেক্ট করতে পারেন। এটি সাধারণত একক প্রপার্টি ইনজেকশনের জন্য ব্যবহৃত হয়, যেমন একটি স্ট্রিং, নাম্বার, বা Boolean ভ্যালু।
উদাহরণ:
ধরা যাক, আমাদের একটি প্রপার্টি ফাইল application.properties রয়েছে এবং আমরা সেটি Spring Bean এ ইনজেক্ট করতে চাই।
application.properties
employee.name=John Doe
employee.department=HR
Employee.java (Bean Class)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Employee {
@Value("${employee.name}")
private String name;
@Value("${employee.department}")
private String department;
public void getEmployeeDetails() {
System.out.println("Employee Name: " + name);
System.out.println("Employee Department: " + department);
}
}
এখানে @Value("${employee.name}") এবং @Value("${employee.department}") ব্যবহার করে প্রপার্টি ফাইলের ভ্যালু Spring Bean-এর মধ্যে ইনজেক্ট করা হয়েছে।
Spring Application Context
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Employee employee = context.getBean(Employee.class);
employee.getEmployeeDetails();
এখানে, @Value অ্যানোটেশন প্রপার্টি ফাইল থেকে ভ্যালু ইনজেক্ট করে এবং getEmployeeDetails() মেথড কল করলে প্রিন্ট হবে:
Employee Name: John Doe
Employee Department: HR
@ConfigurationProperties অ্যানোটেশন ব্যবহার করে DI পরিচালনা
@ConfigurationProperties অ্যানোটেশন Spring Boot-এ একটি শক্তিশালী উপায় যা গ্রুপড কনফিগারেশন ভ্যালু ইনজেক্ট করতে ব্যবহৃত হয়। এটি প্রপার্টি ফাইল বা YAML ফাইলের মাধ্যমে গ্রুপড ভ্যালু সরাসরি Spring Beans-এর প্রপার্টিতে ইনজেক্ট করতে সক্ষম করে।
উদাহরণ:
application.properties
employee.name=John Doe
employee.department=HR
employee.salary=50000
Employee.java (Bean Class)
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "employee")
public class Employee {
private String name;
private String department;
private int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public void getEmployeeDetails() {
System.out.println("Employee Name: " + name);
System.out.println("Employee Department: " + department);
System.out.println("Employee Salary: " + salary);
}
}
এখানে @ConfigurationProperties(prefix = "employee") ব্যবহার করে Spring Bean এর মধ্যে employee.name, employee.department, এবং employee.salary প্রপার্টি ইনজেক্ট করা হয়েছে।
Spring Application Context
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Employee employee = context.getBean(Employee.class);
employee.getEmployeeDetails();
এখানে, Spring Container employee.name, employee.department, এবং employee.salary ভ্যালু গুলি একত্রে ইনজেক্ট করবে এবং getEmployeeDetails() মেথড কল করলে প্রিন্ট হবে:
Employee Name: John Doe
Employee Department: HR
Employee Salary: 50000
@Value এবং @ConfigurationProperties এর মধ্যে পার্থক্য
| বিষয় | @Value | @ConfigurationProperties |
|---|---|---|
| ইনজেক্টের পরিধি | একক প্রপার্টি বা ভ্যালু ইনজেক্ট করতে ব্যবহৃত হয়। | গ্রুপড প্রপার্টি গুলি ইনজেক্ট করতে ব্যবহৃত হয়। |
| কনফিগারেশন ফাইল | প্রপার্টি ফাইল থেকে একক ভ্যালু ইনজেক্ট করা হয়। | একাধিক প্রপার্টি ইনজেক্ট করার জন্য কনফিগারেশন ফাইল বা YAML ফাইল ব্যবহার করা হয়। |
| ব্যবহার | সাধারণত ছোট অথবা একক প্রপার্টি ইনজেকশনের জন্য। | বড় এবং গ্রুপড কনফিগারেশন প্রোপার্টি ইনজেকশনের জন্য। |
| ফ্লেক্সিবিলিটি | একক প্রপার্টি ব্যবহার করে সহজ এবং দ্রুত। | জটিল কনফিগারেশন ডাটা যেমন, নেস্টেড প্রপার্টি সহজভাবে হ্যান্ডেল করতে পারে। |
| অ্যানোটেশন | @Value("${property.key}") | @ConfigurationProperties(prefix = "property.prefix") |
সারাংশ
Spring Framework-এ @Value এবং @ConfigurationProperties দুটি অ্যানোটেশন Spring Beans-এ প্রপার্টি ইনজেকশন সহজভাবে সম্পন্ন করতে সহায়ক। @Value একক প্রপার্টি ইনজেকশন করার জন্য উপযুক্ত, যেখানে @ConfigurationProperties গ্রুপড কনফিগারেশন এবং কমপ্লেক্স প্রপার্টি ইনজেকশনের জন্য ব্যবহার করা হয়। Spring Boot-এ @ConfigurationProperties ব্যবহার করা আরও জনপ্রিয়, কারণ এটি সহজে গ্রুপড কনফিগারেশন ডেটা একত্রে ইনজেক্ট করতে সক্ষম করে।
Spring Framework-এ application.properties এবং application.yml ফাইল দুটি সাধারণ কনফিগারেশন ফাইল যা Spring Boot অ্যাপ্লিকেশনে পরিবেশগত কনফিগারেশন সংরক্ষণ এবং ইনজেক্ট করার জন্য ব্যবহৃত হয়। এই ফাইলগুলিতে ডাটাবেস কনফিগারেশন, সার্ভার পোর্ট, লগিং লেভেল এবং আরও অনেক সেটিংস রাখা যায়। Spring DI (Dependency Injection) ব্যবহার করে এই কনফিগারেশনগুলো Spring Beans-এ ইনজেক্ট করা যায়, যাতে অ্যাপ্লিকেশনের মধ্যে ডাইনামিক কনফিগারেশন ম্যানেজমেন্ট সহজ হয়।
Spring-এ এই কনফিগারেশন ফাইল ব্যবহার করার মাধ্যমে আপনি কনফিগারেশনগুলিকে externalize করতে পারেন, অর্থাৎ, অ্যাপ্লিকেশনটির লজিক থেকে কনফিগারেশন আলাদা রাখতে পারেন, যা পরিবেশ পরিবর্তন বা অন্যান্য কনফিগারেশন টুলগুলোর সাথে সামঞ্জস্যপূর্ণ হতে সহায়ক।
application.properties বা application.yml ফাইলে কনফিগারেশন সেট করা
১. application.properties ফাইল
application.properties ফাইলটি Spring Boot অ্যাপ্লিকেশনের জন্য অন্যতম জনপ্রিয় কনফিগারেশন ফাইল। এখানে আপনি বিভিন্ন কনফিগারেশন সেটিংস রাখতে পারেন। যেমন, ডাটাবেস কানেকশন, সার্ভার পোর্ট, লোগিং সেটিংস ইত্যাদি।
উদাহরণ: application.properties
# Server settings
server.port=8081
# Database settings
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
# Logging settings
logging.level.org.springframework.web=DEBUG
এই কনফিগারেশনগুলির মাধ্যমে, Spring Boot অ্যাপ্লিকেশন শুরু হলে এই ভ্যালুগুলি ইনজেক্ট হয়ে যাবে এবং ব্যবহৃত হবে।
২. application.yml ফাইল
Spring Boot অ্যাপ্লিকেশনগুলিতে application.yml ফাইলটি YAML ফরম্যাটে কনফিগারেশন সরবরাহ করতে ব্যবহৃত হয়। YAML ফাইলটি মানব-পাঠযোগ্য এবং স্ট্রাকচারড, যার কারণে এটি বড় কনফিগারেশন ফাইলগুলির জন্য আরও সুবিধাজনক হতে পারে।
উদাহরণ: application.yml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
logging:
level:
org.springframework.web: DEBUG
এখানে, YAML ফাইলটি application.properties ফাইলের সমান কনফিগারেশন ধারণ করছে, তবে YAML এর কাঠামো ভিন্ন। YAML ফাইলের গঠন দেখতে একটু বেশি পাঠযোগ্য এবং আর্গুমেন্টগুলোর মধ্যে সম্পর্ক স্পষ্ট থাকে।
Spring-এ কনফিগারেশন ইনজেক্ট করা
১. @Value Annotation ব্যবহার করে কনফিগারেশন ইনজেক্ট করা
Spring DI ব্যবহারের মাধ্যমে কনফিগারেশন ফাইল থেকে মান (value) ইনজেক্ট করতে @Value অ্যানোটেশন ব্যবহার করা হয়।
উদাহরণ: @Value দিয়ে application.properties বা application.yml ফাইল থেকে কনফিগারেশন ইনজেক্ট করা
@Component
public class DatabaseService {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String dbUsername;
@Value("${spring.datasource.password}")
private String dbPassword;
public void connect() {
System.out.println("Connecting to database at " + dbUrl);
// Database connection logic
}
}
ব্যাখ্যা:
@Value("${property.name}")ব্যবহার করে কনফিগারেশন ফাইল থেকে ডেটাবেসের ইউআরএল, ইউজারনেম এবং পাসওয়ার্ড ইনজেক্ট করা হয়েছে।- Spring কনটেইনার এই মানগুলিকে
application.propertiesবাapplication.ymlথেকে প্রাপ্ত কনফিগারেশন ফাইলের মান অনুযায়ী ইনজেক্ট করবে।
২. @ConfigurationProperties ব্যবহার করে কনফিগারেশন ইনজেক্ট করা
Spring Boot-এর @ConfigurationProperties অ্যানোটেশনটি একটি ক্লাসে কনফিগারেশন প্রপার্টি মেপিং করতে ব্যবহৃত হয়। এটি ব্যবহার করে আপনি কনফিগারেশন ফাইলের একটি নির্দিষ্ট অংশকে একটি Java ক্লাসের প্রপার্টি হিসেবে ম্যাপ করতে পারেন।
উদাহরণ: @ConfigurationProperties ব্যবহার করে কনফিগারেশন ইনজেক্ট করা
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DatabaseConfig {
private String url;
private String username;
private String password;
// Getters and setters
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void connect() {
System.out.println("Connecting to database at " + url);
// Database connection logic
}
}
ব্যাখ্যা:
@ConfigurationProperties(prefix = "spring.datasource")দ্বারাapplication.propertiesবাapplication.ymlফাইলের ডাটাবেস সম্পর্কিত কনফিগারেশনগুলিDatabaseConfigক্লাসে ইনজেক্ট করা হয়েছে।- এই পদ্ধতি ব্যবহার করে আপনি অনেকগুলি কনফিগারেশন প্রপার্টিকে একসাথে ম্যানেজ করতে পারেন।
৩. Profile-based Configuration
Spring Profiles ব্যবহার করে আপনি বিভিন্ন কনফিগারেশন সেট করতে পারেন নির্দিষ্ট পরিবেশের জন্য (যেমন ডেভেলপমেন্ট, টেস্টিং, প্রোডাকশন ইত্যাদি)। application.properties বা application.yml ফাইলে spring.profiles.active প্রপার্টি সেট করে একটি নির্দিষ্ট প্রোফাইল সক্রিয় করা হয়।
উদাহরণ: application.properties এ Profiles ব্যবহার
# application.properties for development environment
spring.profiles.active=dev
# Development profile specific configuration
spring.datasource.url=jdbc:mysql://localhost:3306/devdb
spring.datasource.username=devuser
spring.datasource.password=devpassword
উদাহরণ: application.yml এ Profiles ব্যবহার
spring:
profiles:
active: dev
spring.datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpassword
এখন, Spring কনটেইনারের মধ্যে ডেভেলপমেন্ট প্রোফাইলের কনফিগারেশনটি সক্রিয় থাকবে এবং সেই অনুযায়ী নির্ভরতাগুলি ইনজেক্ট হবে।
সারাংশ
Spring Framework-এ application.properties এবং application.yml ফাইলগুলি ব্যবহারের মাধ্যমে আপনি সহজেই কনফিগারেশন এক্সটার্নালাইজ করতে পারেন এবং Spring DI ব্যবহার করে এগুলি Java ক্লাসে ইনজেক্ট করতে পারেন। @Value এবং @ConfigurationProperties অ্যানোটেশনগুলির মাধ্যমে আপনি কনফিগারেশন ফাইল থেকে ডাইনামিক ডেটা ইনজেক্ট করতে পারেন, যা অ্যাপ্লিকেশনটি আরও নমনীয় এবং পরিবেশে নির্ভরশীল করে তোলে। Spring Profiles ব্যবহার করে নির্দিষ্ট পরিবেশে বিভিন্ন কনফিগারেশন সেট করা সম্ভব, যা ডেভেলপমেন্ট, টেস্টিং এবং প্রোডাকশন ব্যবস্থাপনার জন্য অত্যন্ত কার্যকরী।
স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) হল একটি প্রযুক্তি যা কোডের মধ্যে loose coupling তৈরি করে, অর্থাৎ একটি ক্লাসের উপর অন্য ক্লাসের নির্ভরশীলতা কমায়। এটি স্প্রিং কনটেইনারের মাধ্যমে ডিপেনডেন্সি ইনজেকশন ব্যবস্থাপনা সহজ করে। External Configuration এর মাধ্যমে স্প্রিং ডিপেনডেন্সি ইনজেকশন পরিচালনা করা হয়, যার মাধ্যমে অ্যাপ্লিকেশন কনফিগারেশন এবং ডিপেনডেন্সি এক্সটারনালি (অর্থাৎ, স্প্রিং কনফিগারেশন ফাইল বা প্রোপার্টি ফাইলের মাধ্যমে) পরিচালনা করা সম্ভব হয়।
স্প্রিং এ External Configuration বলতে বুঝায় এমন কনফিগারেশন যা স্প্রিং কনটেইনারে সরাসরি কোডে না লিখে, বরং একটি এক্সটারনাল ফাইলে সংরক্ষণ করা হয়। এই কনফিগারেশন ফাইল সাধারণত XML, Properties ফাইল বা Annotation-based configuration হতে পারে। এই পদ্ধতিতে আমরা DI (Dependency Injection) সম্পাদন করি।
External Configuration এবং Dependency Injection (DI)
স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশন ব্যবস্থাপনার জন্য কনফিগারেশন ফাইল ব্যবহার করা হয়। ডিপেনডেন্সিগুলোর কনফিগারেশন এবং ইনজেকশন পরিচালনা করা হয় স্প্রিং কনটেইনারের মাধ্যমে। প্রধান দুটি পদ্ধতি রয়েছে:
- XML-based Configuration (প্রাচীন পদ্ধতি)
- Annotation-based Configuration (নতুন পদ্ধতি)
1. XML-based Configuration (Traditional)
XML কনফিগারেশন স্প্রিং ডিপেনডেন্সি ইনজেকশনের জন্য একটি প্রাচীন পদ্ধতি। এখানে সব ধরনের Bean এবং তাদের ডিপেনডেন্সি XML ফাইলে সংজ্ঞায়িত করা হয়।
উদাহরণ: XML-based Dependency Injection
beans.xml কনফিগারেশন ফাইল
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Bean Definition for EmployeeService -->
<bean id="employeeService" class="com.example.EmployeeService">
<constructor-arg ref="employeeRepository"/>
</bean>
<!-- Bean Definition for EmployeeRepository -->
<bean id="employeeRepository" class="com.example.EmployeeRepository"/>
</beans>
EmployeeService.java ক্লাস
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Constructor-based Dependency Injection
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee() {
employeeRepository.save();
}
}
EmployeeRepository.java ক্লাস
public class EmployeeRepository {
public void save() {
System.out.println("Employee saved");
}
}
এখানে, EmployeeService Bean এর মধ্যে EmployeeRepository Bean ইনজেক্ট করা হয়েছে XML-based configuration এর মাধ্যমে।
2. Annotation-based Configuration (Modern Approach)
এটি স্প্রিং ফ্রেমওয়ার্কের আধুনিক এবং সহজ পদ্ধতি। এখানে @Component, @Autowired এবং @Configuration অ্যানোটেশন ব্যবহার করে ডিপেনডেন্সি ইনজেকশন কনফিগারেশন পরিচালিত হয়।
উদাহরণ: Annotation-based Dependency Injection
EmployeeService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
@Autowired // Autowire the dependency
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee() {
employeeRepository.save();
}
}
EmployeeRepository.java
import org.springframework.stereotype.Component;
@Component
public class EmployeeRepository {
public void save() {
System.out.println("Employee saved");
}
}
AppConfig.java (Configuration Class)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Beans will be auto-detected and injected via annotations
}
MainApplication.java (Main Application)
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApplication {
public static void main(String[] args) {
// Initialize Spring container
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Retrieve bean from the context
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Use the bean
employeeService.saveEmployee();
context.close();
}
}
এখানে, @Autowired অ্যানোটেশন ব্যবহার করে EmployeeRepository ইনজেক্ট করা হচ্ছে এবং @Component অ্যানোটেশন ব্যবহার করে EmployeeService এবং EmployeeRepository Beans ডিফাইন করা হয়েছে। স্প্রিং কনটেইনার এই Beans গুলি অ্যাপ্লিকেশন কোডে ইনজেক্ট করবে।
3. External Configuration via Property Files
স্প্রিং ডিপেনডেন্সি ইনজেকশন কনফিগারেশন প্রপার্টি ফাইলের মাধ্যমে এক্সটারনালি করা যেতে পারে। যেমন, application.properties বা application.yml ফাইল ব্যবহার করে কনফিগারেশন ম্যানেজমেন্ট করা হয়।
উদাহরণ: External Configuration using application.properties
application.properties ফাইল
employee.name=John Doe
employee.age=30
EmployeeService.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
@Value("${employee.name}")
private String name;
@Value("${employee.age}")
private int age;
public void displayEmployeeInfo() {
System.out.println("Employee Name: " + name + ", Age: " + age);
}
}
এখানে, employee.name এবং employee.age প্রপার্টি ফাইল থেকে @Value অ্যানোটেশন ব্যবহার করে ভ্যালু ইনজেক্ট করা হচ্ছে।
AppConfig.java (Configuration Class)
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example")
@PropertySource("classpath:application.properties")
public class AppConfig {
}
এখানে, @PropertySource অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনারকে application.properties ফাইল থেকে কনফিগারেশন লোড করতে নির্দেশ দেয়া হচ্ছে।
সারাংশ
External Configuration এবং Dependency Injection (DI) স্প্রিং ফ্রেমওয়ার্কে কোডের মাঝে ঢিলামি (loose coupling) আনা এবং ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করার জন্য ব্যবহৃত হয়। XML-based configuration এবং Annotation-based configuration এর মাধ্যমে স্প্রিং কনটেইনার ডিপেনডেন্সি ইনজেকশন পরিচালনা করে। এছাড়াও, স্প্রিং প্রপার্টি ফাইল (যেমন application.properties) ব্যবহার করে এক্সটারনাল কনফিগারেশন করা যায়। এই সব পদ্ধতি ব্যবহার করে স্প্রিং অ্যাপ্লিকেশনগুলোকে আরও ফ্লেক্সিবল, মেইনটেইনেবল এবং স্কেলেবল করা যায়।
Read more