স্প্রিং ফ্রেমওয়ার্কে, বীন (Bean) হলো কনটেইনার দ্বারা পরিচালিত একটি অবজেক্ট। স্প্রিং বীন কনফিগারেশন বলতে বোঝায় কীভাবে স্প্রিং কনটেইনারে একটি বীন তৈরি, ইনিশিয়ালাইজ এবং পরিচালনা করা হয়। এটি স্প্রিং অ্যাপ্লিকেশনের মূল অংশ, যা ইনভার্সন অব কন্ট্রোল (IoC) এবং ডিপেনডেন্সি ইনজেকশন (DI) ব্যবহার করে বীন ম্যানেজমেন্ট সহজ করে।
স্প্রিং-এ বীন কনফিগার করার প্রধান তিনটি পদ্ধতি রয়েছে:
স্প্রিং ফ্রেমওয়ার্কের প্রাথমিক সময়ে, বীন কনফিগার করার জন্য XML ব্যবহার করা হতো। applicationContext.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 id="myBean" class="com.example.MyBean">
<property name="propertyName" value="propertyValue"/>
</bean>
</beans>
স্প্রিং অ্যানোটেশন ব্যবহার করে বীন কনফিগারেশন করা আরও সহজ হয়েছে। এটি কোডের মধ্যে সরাসরি কনফিগারেশন যুক্ত করে।
উদাহরণ:
@Component
public class MyBean {
@Value("propertyValue")
private String propertyName;
// Getter and Setter
}
এই পদ্ধতিতে @Component
, @Service
, @Repository
, এবং @Controller
অ্যানোটেশন ব্যবহার করা হয়।
স্প্রিং-এর আধুনিক অ্যাপ্লিকেশনে জাভা-কনফিগারেশন পদ্ধতি জনপ্রিয়। এতে একটি @Configuration
ক্লাস ব্যবহার করে বীন কনফিগার করা হয়।
উদাহরণ:
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
myBean.setPropertyName("propertyValue");
return myBean;
}
}
স্প্রিং বীনের একটি নির্দিষ্ট লাইফসাইকেল রয়েছে যা কনটেইনার দ্বারা পরিচালিত হয়। এই লাইফসাইকেল তিনটি ধাপের সমন্বয়ে গঠিত:
স্প্রিং কনটেইনার @Bean
বা XML ডিফিনিশনের মাধ্যমে বীন তৈরি করে।
বীন ইনিশিয়ালাইজ করার জন্য @PostConstruct
বা init-method
ব্যবহার করা যায়।
উদাহরণ:
@PostConstruct
public void init() {
System.out.println("Bean is initialized");
}
বীন ধ্বংস করার জন্য @PreDestroy
বা destroy-method
ব্যবহার করা হয়।
উদাহরণ:
@PreDestroy
public void destroy() {
System.out.println("Bean is destroyed");
}
স্প্রিং ফ্রেমওয়ার্ক বীনের পাঁচটি স্কোপ সাপোর্ট করে:
উদাহরণ:
@Component
@Scope("prototype")
public class MyBean {
// Class definition
}
স্প্রিং বীন কনফিগারেশন IoC এবং DI বাস্তবায়নের মাধ্যমে অ্যাপ্লিকেশনকে আরও মডুলার, স্কেলেবল এবং রিইউসেবল করে তোলে। বিভিন্ন কনফিগারেশন পদ্ধতি ডেভেলপারদের কাজকে সহজ এবং প্রয়োজনমাফিক বীন পরিচালনা করার সুযোগ দেয়।
Spring Framework একটি হালকা ওজনের এবং শক্তিশালী জাভা ফ্রেমওয়ার্ক, যা dependency injection (DI) এবং inversion of control (IoC) ধারণার উপর ভিত্তি করে তৈরি। Spring Bean Configuration হল একটি গুরুত্বপূর্ণ অংশ যা Spring কন্টেইনারে নির্দিষ্ট bean গুলি কনফিগার এবং ম্যানেজ করতে সাহায্য করে। Spring Framework-এ প্রধানত দুটি উপায়ে Bean কনফিগার করা যায়: XML-based configuration এবং Annotation-based configuration।
এখানে আমরা XML-based Spring Bean Configuration নিয়ে বিস্তারিত আলোচনা করব, যেখানে Spring beans XML ফাইলের মাধ্যমে কনফিগার এবং ম্যানেজ করা হয়।
XML-based configuration-এ, Spring Beans এবং তাদের ডিপেনডেন্সি গুলি XML ফাইলে কনফিগার করা হয়। এটি সাধারণত beans.xml
বা অন্য যেকোনো নামের XML ফাইলের মধ্যে রাখা হয়। Spring IoC কন্টেইনার এই XML কনফিগারেশন ফাইল থেকে Bean গুলিকে লোড করে এবং তাদের মধ্যে ডিপেনডেন্সি ইনজেকশন (DI) প্রয়োগ করে।
<bean>
ট্যাগের মাধ্যমে কনফিগার করা হয়। প্রতিটি Bean এর মধ্যে একটি id
এবং class
উল্লেখ করা হয়।autowire
অ্যাট্রিবিউট ব্যবহার করে Beans এর মধ্যে স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেকশন করা যায়।ধরা যাক, আমাদের একটি অ্যাপ্লিকেশন রয়েছে যেখানে UserService
এবং UserRepository
নামে দুটি Bean কনফিগার করতে হবে।
এখানে UserService
এবং UserRepository
Bean গুলির XML কনফিগারেশন উদাহরণ দেয়া হলো।
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- Defining the UserRepository Bean -->
<bean id="userRepository" class="com.example.repository.UserRepository">
<!-- Constructor-based DI: if UserRepository has a dependency -->
<constructor-arg ref="someDependency"/>
</bean>
<!-- Defining the UserService Bean -->
<bean id="userService" class="com.example.service.UserService">
<!-- Setter-based DI: Injecting dependency via setter method -->
<property name="userRepository" ref="userRepository"/>
</bean>
</beans>
ব্যাখ্যা:
UserRepository
এবং UserService
দুটি Bean কনফিগার করা হয়েছে XML ফাইলে।userRepository
Bean কে UserService
Bean এর মাধ্যমে ইনজেক্ট করা হচ্ছে property
ট্যাগের মাধ্যমে।এখন, UserService
এবং UserRepository
ক্লাসগুলির কিছু কোড:
// UserService.java
package com.example.service;
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void addUser(String name) {
userRepository.save(name);
}
}
// UserRepository.java
package com.example.repository;
public class UserRepository {
public void save(String name) {
System.out.println("User " + name + " saved to the database.");
}
}
XML কনফিগারেশন ফাইল থেকে Spring Context লোড করার জন্য একটি Main ক্লাস তৈরি করা হয়:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.example.service.UserService;
public class Main {
public static void main(String[] args) {
// Load Spring context from XML configuration
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Retrieve the userService bean from Spring context
UserService userService = context.getBean("userService", UserService.class);
// Use the userService bean
userService.addUser("John Doe");
}
}
ব্যাখ্যা:
ApplicationContext
ব্যবহার করে Spring কন্টেইনার লোড করা হচ্ছে beans.xml
ফাইল থেকে।UserService
Bean কে Spring কন্টেইনার থেকে রিট্রিভ করে এবং তার মেথড কল করা হচ্ছে।User John Doe saved to the database.
Autowiring:
autowire
প্রপার্টি ব্যবহার করে নির্দিষ্ট করতে পারেন Spring কে কোন ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে হবে।উদাহরণ:
<bean id="userService" class="com.example.service.UserService" autowire="byType">
<property name="userRepository" ref="userRepository"/>
</bean>
Profiles:
উদাহরণ:
<beans profile="dev">
<!-- Beans specific to the dev environment -->
</beans>
<beans profile="prod">
<!-- Beans specific to the prod environment -->
</beans>
XML-based Spring Bean Configuration Spring Framework-এ ব্যবহৃত একটি শক্তিশালী কনফিগারেশন পদ্ধতি যা Spring IoC কন্টেইনারকে Bean এবং তাদের ডিপেনডেন্সি ম্যানেজ করতে সাহায্য করে। Spring XML কনফিগারেশন কোড থেকে কনফিগারেশন আলাদা রাখার মাধ্যমে অ্যাপ্লিকেশন ডেভেলপমেন্টে মডুলারিটি এবং ফ্লেক্সিবিলিটি আনে। এতে ডিপেনডেন্সি ইনজেকশন (DI), Bean স্কোপ, অ্যাট্রিবিউট ইনজেকশন, এবং অন্যান্য কার্যকারিতা সহজেই কনফিগার করা যায়।
স্প্রিং ফ্রেমওয়ার্ক জাভা অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক যা বিভিন্ন কনফিগারেশন পদ্ধতি প্রদান করে। এদের মধ্যে Java-based Configuration অন্যতম, যেখানে আপনি কনফিগারেশন এবং স্প্রিং কনটেইনারের বিহেভিয়ার কোডের মাধ্যমে ডিফাইন করেন। এটি স্প্রিং ফ্রেমওয়ার্কের XML-based configuration পদ্ধতির তুলনায় আরও আধুনিক এবং টাইপ সেফ পদ্ধতি।
স্প্রিং ৩.০ থেকে Java-based Configuration জনপ্রিয়তা পেয়েছে এবং এতে আপনি স্প্রিং কনফিগারেশন ক্লাস তৈরি করতে পারেন যা @Configuration এবং @Bean অ্যানোটেশন ব্যবহার করে।
Java-based configuration হলো স্প্রিং ফ্রেমওয়ার্কে কনফিগারেশন তৈরি করার একটি পদ্ধতি যেখানে আপনি Java কোডের মাধ্যমে স্প্রিং বিউন্স (Beans) কনফিগার করেন, যেটি XML কনফিগারেশন ফাইলের পরিবর্তে ব্যবহৃত হয়। এতে, আপনি স্প্রিং কনটেইনারের কার্যক্ষমতা, বিউন কনফিগারেশন, ডিপেনডেন্সি ইনজেকশন ইত্যাদি সরাসরি কোডের মাধ্যমে ডিফাইন করতে পারেন।
স্প্রিং 3.0 এ @Configuration অ্যানোটেশনটি অন্তর্ভুক্ত করা হয়, যা একটি ক্লাসকে স্প্রিং কনফিগারেশন ক্লাস হিসেবে চিহ্নিত করে। এই অ্যানোটেশনটি ব্যবহার করার মাধ্যমে স্প্রিং জানে যে, এই ক্লাসটি কনফিগারেশন ডিফাইন করতে ব্যবহৃত হবে এবং এতে @Bean অ্যানোটেশন সহ মেথডগুলির মাধ্যমে স্প্রিং বিউন ডিফাইন করা হবে।
@Bean অ্যানোটেশনটি ব্যবহৃত হয় স্প্রিং কনটেইনারে একটি মেথডের মাধ্যমে একটি বিউন তৈরি করতে। যখন আপনি @Bean অ্যানোটেশন ব্যবহার করেন, এটি স্প্রিংকে জানায় যে, ওই মেথডটি একটি স্প্রিং বিউন তৈরি করবে এবং সেই বিউন স্প্রিং কনটেইনারে রেজিস্টার হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // Mark the class as a configuration class
public class AppConfig {
// Define a bean of type Employee
@Bean
public Employee employee() {
return new Employee("John Doe", 30);
}
// Define a bean of type Company
@Bean
public Company company() {
return new Company(employee());
}
}
এখানে, AppConfig ক্লাসটি @Configuration দ্বারা চিহ্নিত, যার মাধ্যমে এটি স্প্রিং কনফিগারেশন ক্লাস হিসাবে ব্যবহৃত হবে। এখানে দুটি @Bean মেথড রয়েছে:
public class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and setters
}
public class Company {
private Employee employee;
public Company(Employee employee) {
this.employee = employee;
}
// Getters and setters
}
এখানে Employee এবং Company ক্লাস দুটি সিম্পল POJO (Plain Old Java Object) যা স্প্রিং কনটেইনার দ্বারা ইনস্ট্যান্সিয়েট করা হবে।
স্প্রিং কনটেইনারের মধ্যে বিউন ইনজেকশন এবং অ্যাপ্লিকেশন কনফিগারেশন ব্যবহারের জন্য AnnotationConfigApplicationContext ব্যবহার করতে হবে।
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.ApplicationContext;
public class MainApp {
public static void main(String[] args) {
// Initialize the context and load the configuration class
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Get the Employee bean from the context
Employee employee = context.getBean(Employee.class);
System.out.println("Employee Name: " + employee.getName());
System.out.println("Employee Age: " + employee.getAge());
// Get the Company bean from the context
Company company = context.getBean(Company.class);
System.out.println("Company Employee: " + company.getEmployee().getName());
}
}
এখানে AnnotationConfigApplicationContext ব্যবহার করে AppConfig কনফিগারেশন ক্লাসটি লোড করা হচ্ছে। স্প্রিং কনটেইনার থেকে Employee এবং Company বিউন খুঁজে বের করা হচ্ছে এবং তাদের তথ্য প্রিন্ট করা হচ্ছে।
বৈশিষ্ট্য | @Configuration | @Bean |
---|---|---|
কাজ | একটি ক্লাসকে স্প্রিং কনফিগারেশন ক্লাস হিসাবে চিহ্নিত করে। | একটি মেথডকে স্প্রিং বিউন তৈরি করার জন্য চিহ্নিত করে। |
ব্যবহার | সাধারণত ক্লাস স্তরে ব্যবহৃত। | মেথড স্তরে ব্যবহৃত। |
প্রয়োজনীয়তা | কনফিগারেশন ক্লাসের জন্য ব্যবহৃত। | স্প্রিং কনটেইনারে বিউন রেজিস্টার করার জন্য ব্যবহৃত। |
আবশ্যকতা | সাধারণত @Bean ব্যবহারের জন্য এই অ্যানোটেশন প্রয়োজন। | কোনো নির্দিষ্ট অ্যানোটেশন নেই, তবে কেবল @Bean এর জন্য ব্যবহৃত হয়। |
Java-based configuration স্প্রিং ফ্রেমওয়ার্কে একটি শক্তিশালী কনফিগারেশন পদ্ধতি, যা স্প্রিং কনটেইনার এবং বিউন ডিফিনিশনকে সহজ এবং টাইপ সেফ উপায়ে পরিচালনা করতে সহায়তা করে। @Configuration অ্যানোটেশন স্প্রিং কনফিগারেশন ক্লাস হিসাবে কাজ করে এবং @Bean অ্যানোটেশন স্প্রিং বিউন তৈরি করতে ব্যবহৃত হয়। স্প্রিং Java-based configuration এর মাধ্যমে ডেভেলপাররা পরিষ্কার, মডুলার এবং কনফিগারেশন কোড সহজে তৈরি করতে পারেন, যা XML-based configuration এর তুলনায় অনেক বেশি সোজা এবং আধুনিক।
স্প্রিং ফ্রেমওয়ার্কের Annotation-driven configuration একটি আধুনিক এবং সহজ উপায় যা স্প্রিং কনফিগারেশন পরিচালনা করতে ব্যবহৃত হয়। স্প্রিংয়ের পুরোনো কনফিগারেশন পদ্ধতিতে XML ফাইল ব্যবহার করা হতো, কিন্তু annotation-driven configuration এ আপনি কনফিগারেশন কোডটি সরাসরি জাভা ক্লাসে অ্যানোটেশন ব্যবহার করে লিখতে পারেন। এটি কোডের ক্লিনলিনেস, মডুলারিটি, এবং পারফরম্যান্স উন্নত করে এবং স্প্রিং কনফিগারেশনকে আরও সহজ ও পরিষ্কার করে তোলে।
স্প্রিং ফ্রেমওয়ার্কে অ্যানোটেশন-ভিত্তিক কনফিগারেশন পরিচালনার জন্য বেশ কিছু গুরুত্বপূর্ণ অ্যানোটেশন রয়েছে:
@Configuration
অ্যানোটেশন স্প্রিং ক্লাসে ব্যবহৃত হয় যা স্প্রিং কনটেইনারে বিন কনফিগারেশন নির্দেশ করে। এই অ্যানোটেশনটি ক্লাসকে স্প্রিং কনফিগারেশন ক্লাস হিসেবে চিহ্নিত করে এবং স্প্রিং কনটেইনারে ক্লাসের মধ্যে থাকা মেথডগুলোকে বীন ডিফিনিশন হিসেবে ব্যবহৃত হতে দেয়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
এখানে, @Configuration
অ্যানোটেশন দিয়ে AppConfig
ক্লাসকে স্প্রিং কনফিগারেশন ক্লাস হিসেবে চিহ্নিত করা হয়েছে এবং @Bean
অ্যানোটেশন ব্যবহার করে myService()
মেথডে একটি বীন ডিফাইন করা হয়েছে।
স্প্রিংয়ের @Component
এবং এর বিশেষায়িত ভ্যারিয়েন্ট যেমন @Service
, @Repository
, এবং @Controller
অ্যানোটেশনগুলি স্প্রিং কনটেইনারে বীন ডিফাইনেশন হিসেবে ব্যবহৃত হয়।
@Component
: সাধারণ স্প্রিং বীন হিসেবে ব্যবহৃত হয়।@Service
: সার্ভিস লেয়ারের ক্লাসে ব্যবহৃত হয়।@Repository
: ডেটা অ্যাক্সেস লেয়ারে ব্যবহৃত হয় (ডেটাবেস অপারেশনগুলো এক্সেপশন হ্যান্ডলিং সহ করা হয়)।@Controller
: ওয়েব কন্ট্রোলার হিসেবে ব্যবহৃত হয়।import org.springframework.stereotype.Service;
@Service
public class MyServiceImpl implements MyService {
@Override
public void performService() {
System.out.println("Service is performed.");
}
}
এখানে, @Service
অ্যানোটেশনটি MyServiceImpl
ক্লাসকে স্প্রিং কনটেইনারে একটি সার্ভিস বীন হিসেবে নিবন্ধিত করে।
@Autowired
অ্যানোটেশন স্প্রিং কনটেইনার থেকে ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়। এটি ক্লাসের প্যারামিটার, কনস্ট্রাকটর অথবা ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করতে ব্যবহার করা হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyController {
private MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
public void handleRequest() {
myService.performService();
}
}
এখানে, @Autowired
ব্যবহার করে MyService
ইন্টারফেসের ইনস্ট্যান্স MyController
ক্লাসে ইনজেক্ট করা হচ্ছে।
@Bean
অ্যানোটেশন স্প্রিং কনফিগারেশন ক্লাসে ব্যবহৃত হয় এবং এটি স্প্রিং কনটেইনারে একটি বীন ডিফাইন করার জন্য ব্যবহৃত হয়। যখন @Bean
অ্যানোটেশন ব্যবহার করা হয়, তখন স্প্রিং সেই মেথডের রিটার্ন ভ্যালুকে বীন হিসেবে রেজিস্টার করে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
এখানে, @Bean
অ্যানোটেশনটি myService()
মেথডের মাধ্যমে MyServiceImpl
ক্লাসের একটি বীন তৈরি করছে।
স্প্রিং এওপি (AOP) ব্যবহারের জন্য @EnableAspectJAutoProxy
অ্যানোটেশন ব্যবহৃত হয়। এটি স্প্রিং কনটেইনারে AOP প্রসেসিং সক্ষম করে এবং AspectJ অ্যানোটেশন সমর্থন করে।
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
// AOP configuration here
}
এখানে, @EnableAspectJAutoProxy
অ্যানোটেশনটি স্প্রিং কনটেইনারে AOP সক্রিয় করেছে।
স্প্রিং কনফিগারেশনে অ্যানোটেশন ব্যবহারের মাধ্যমে কনফিগারেশনটি আরও সহজ ও পরিষ্কার করা সম্ভব। এখানে, @Configuration
ক্লাসে বিভিন্ন বীন ডিফাইন করা হয় এবং @Autowired
এর মাধ্যমে ডিপেনডেন্সি ইনজেকশন সঞ্চালিত হয়।
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
এখানে, @ComponentScan
অ্যানোটেশনটি স্প্রিং কনটেইনারকে com.example
প্যাকেজের মধ্যে সকল কম্পোনেন্ট বা বীন খুঁজতে বলে এবং @Bean
এর মাধ্যমে স্প্রিং কনটেইনারে MyService
বীন ডিফাইন করা হয়।
স্প্রিং ফ্রেমওয়ার্কের মধ্যে Annotation-driven configuration একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য, যা XML কনফিগারেশন এর পরিবর্তে সরাসরি জাভা ক্লাসে অ্যানোটেশন ব্যবহার করে কনফিগারেশন তৈরি করার সুবিধা দেয়। এতে কোডের মডুলারিটি, পরিষ্কারতা এবং পারফরম্যান্স উন্নত হয়। স্প্রিং এর প্রধান অ্যানোটেশন-ভিত্তিক কনফিগারেশন অ্যানোটেশনগুলো যেমন @Configuration
, @Component
, @Service
, @Repository
, @Controller
, @Autowired
, @Bean
ইত্যাদি স্প্রিং কনফিগারেশন আরও সহজ, পরিষ্কার এবং মডুলার তৈরি করে।
স্প্রিং ফ্রেমওয়ার্কে Bean Configuration হল একটি প্রক্রিয়া যার মাধ্যমে স্প্রিং কনটেইনারকে বলে দেওয়া হয় কিভাবে এবং কখন একটি অবজেক্ট (bean) তৈরি হবে এবং এর ডিপেনডেন্সিগুলি কিভাবে ইনজেক্ট করা হবে। স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) এর মাধ্যমে আপনি একাধিক কনফিগারেশন পদ্ধতি ব্যবহার করে বীন কনফিগার করতে পারেন, যেমন XML কনফিগারেশন, অ্যানোটেশন কনফিগারেশন এবং Java-based কনফিগারেশন।
এখানে, আমরা Bean Configuration এর তিনটি সাধারণ পদ্ধতির (XML, Annotations, এবং Java-based Configuration) উদাহরণসহ আলোচনা করব।
স্প্রিং ফ্রেমওয়ার্কে XML-based configuration প্রাথমিকভাবে ব্যবহৃত হত, এবং এখনো কিছু অ্যাপ্লিকেশনে ব্যবহৃত হয়। এখানে একটি bean কনফিগার করতে XML ফাইলের মধ্যে কনফিগারেশন করতে হয়।
beans.xml
ফাইল তৈরি করুন:
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd">
<!-- Define a bean for UserService -->
<bean id="userService" class="com.example.UserService">
<!-- Inject dependencies -->
</bean>
<!-- Define a bean for UserController -->
<bean id="userController" class="com.example.UserController">
<constructor-arg ref="userService"/>
</bean>
</beans>
ব্যাখ্যা:
userService
এবং userController
নামের দুটি bean কনফিগার করা হয়েছে।userController
এর জন্য userService
ডিপেনডেন্সি ইনজেক্ট করা হয়েছে constructor-arg
দ্বারা।package com.example;
public class UserService {
public void createUser(String name) {
System.out.println("User " + name + " created.");
}
}
package com.example;
public class UserController {
private UserService userService;
// Constructor-based DI
public UserController(UserService userService) {
this.userService = userService;
}
public void processUser(String name) {
userService.createUser(name);
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
public static void main(String[] args) {
// Load Spring context from XML file
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Retrieve bean from the context
UserController userController = (UserController) context.getBean("userController");
userController.processUser("John Doe");
}
}
Output:
User John Doe created.
এখানে, userController
বীনটি কনফিগার করা হয়েছে, এবং userService
বীনটি কনস্ট্রাক্টর দিয়ে ইনজেক্ট করা হয়েছে।
স্প্রিং 2.5 থেকে Annotations-based configuration ব্যবহার করা শুরু হয়, যা খুবই জনপ্রিয় এবং সহজ। এর মাধ্যমে @Component, @Autowired, এবং @Configuration অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনারে বীন কনফিগার করা যায়।
package com.example;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void createUser(String name) {
System.out.println("User " + name + " created.");
}
}
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
private final UserService userService;
// Autowire the UserService dependency
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
public void processUser(String name) {
userService.createUser(name);
}
}
package com.example;
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 {
@Bean
public UserController userController() {
return new UserController(userService());
}
@Bean
public UserService userService() {
return new UserService();
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
// Load Spring context from Java-based config class
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Retrieve bean from the context
UserController userController = context.getBean(UserController.class);
userController.processUser("John Doe");
}
}
Output:
User John Doe created.
এখানে, আমরা @Service
, @Controller
, এবং @Autowired
অ্যানোটেশন ব্যবহার করেছি, যা স্প্রিং কনটেইনারে বীন সৃষ্টির জন্য এবং ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়েছে।
এখন, Java-based Configuration এর মাধ্যমে আমরা স্প্রিং বীন কনফিগারেশন করতে পারি। এটি স্প্রিং 3.0+ থেকে শুরু হওয়া একটি কৌশল, যা @Configuration
অ্যানোটেশন ব্যবহার করে স্প্রিং কনফিগারেশন ক্লাস তৈরি করা হয়।
package com.example;
public class UserService {
public void createUser(String name) {
System.out.println("User " + name + " created.");
}
}
package com.example;
public class UserController {
private UserService userService;
// Setter-based DI
public void setUserService(UserService userService) {
this.userService = userService;
}
public void processUser(String name) {
userService.createUser(name);
}
}
package com.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public UserController userController() {
UserController userController = new UserController();
userController.setUserService(userService());
return userController;
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Retrieve bean from the context
UserController userController = context.getBean(UserController.class);
userController.processUser("John Doe");
}
}
Output:
User John Doe created.
এখানে, Java-based configuration ব্যবহার করে স্প্রিং বীন কনফিগার করা হয়েছে।
স্প্রিং ফ্রেমওয়ার্কে Bean Configuration এর তিনটি সাধারণ পদ্ধতি হলো:
@Component
, @Service
, @Autowired
)।@Configuration
এবং @Bean
অ্যানোটেশন ব্যবহার করে Java কোডে কনফিগারেশন করা।এই তিনটি পদ্ধতির মাধ্যমে আপনি স্প্রিং কনটেইনারে বীন কনফিগার এবং ডিপেনডেন্সি ইনজেকশন পরিচালনা করতে পারেন। Annotation-based এবং Java-based কনফিগারেশন বর্তমানে সবচেয়ে বেশি ব্যবহৃত হয়, কারণ এগুলো কোডের মধ্যে কমপ্যাক্ট এবং সহজে রক্ষণাবেক্ষণযোগ্য।
Read more