Spring Boot এর Dependency Injection এবং Beans

স্প্রিং বুট (Spring Boot) - Java Technologies

441

Spring Boot একটি শক্তিশালী ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন ডেভেলপমেন্টে Dependency Injection (DI) এবং Beans ব্যবহারের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, স্কেলেবিলিটি এবং টেস্টেবিলিটি বৃদ্ধি করে। Spring Framework এর Dependency Injection এবং Beans ব্যবস্থাপনা এর অন্যতম মূল ধারণা। Spring Boot এ DI ব্যবহার করে, অবজেক্ট তৈরি এবং তাদের মধ্যে সম্পর্ক স্থাপন সহজ হয়।


Dependency Injection (DI)

Dependency Injection হল একটি ডিজাইন প্যাটার্ন যার মাধ্যমে অবজেক্টগুলোর নির্ভরতা (dependencies) বাইরের মাধ্যমে ইনজেক্ট করা হয়, অর্থাৎ, অবজেক্ট নিজে তার ডিপেনডেন্সি তৈরি না করে, অন্য কোথাও থেকে তা ইনজেক্ট করা হয়। এটি কন্ট্রোল ইনভার্সন (Inversion of Control - IoC) এর একটি অংশ, যেখানে Spring IoC কন্টেইনার অবজেক্টগুলির সৃষ্টি এবং তাদের মধ্যে সম্পর্ক স্থাপন করে।

Spring Boot এ DI এর মাধ্যমে কোড অনেক বেশি মডুলার এবং টেস্টযোগ্য হয়। সাধারণত @Autowired এনোটেশন ব্যবহার করে DI পরিচালনা করা হয়।

DI এর সুবিধাসমূহ:

  • কমপ্লেক্সিটি কমানো: ক্লাসগুলির মধ্যে সম্পর্ক সহজভাবে তৈরি হয়, যেহেতু তাদের মধ্যে নির্ভরতা স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়।
  • টেস্টেবিলিটি বৃদ্ধি: একে অপরের নির্ভরতাগুলিকে মক (mock) বা স্টাব (stub) করে সহজে টেস্ট করা সম্ভব হয়।
  • কোড পুনঃব্যবহারযোগ্যতা: একই অবজেক্ট বা সেবা (service) একাধিক জায়গায় ব্যবহৃত হতে পারে।

Spring Boot এ Dependency Injection ব্যবহারের উদাহরণ

1. Service এবং Repository Bean তৈরি

ধরা যাক, আমাদের একটি UserService এবং UserRepository ক্লাস প্রয়োজন। এখানে UserService ক্লাসে UserRepository কে DI করা হবে।

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public String getUser() {
        return userRepository.findUser();
    }
}
package com.example.demo;

import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {

    public String findUser() {
        return "John Doe";
    }
}

2. Controller তে Dependency Injection ব্যবহার

এখন UserService কে UserController তে ইনজেক্ট করা হবে। @Autowired এনোটেশন ব্যবহার করে UserService ইনজেক্ট করা হয়েছে।

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user")
    public String getUser() {
        return userService.getUser();
    }
}

3. অ্যাপ্লিকেশন চালানো

এই কোডটি Spring Boot অ্যাপ্লিকেশন হিসেবে রান করালে, আপনি http://localhost:8080/user এই URL তে গিয়ে "John Doe" দেখতে পারবেন, যেটি UserService থেকে UserRepository এর মাধ্যমে এসেছে।


Beans

Spring Framework এ Beans হল Spring IoC কন্টেইনারের একটি অংশ, যা Spring Boot অ্যাপ্লিকেশনে অবজেক্টের আউটপুট এবং লাইফ সাইকেল ম্যানেজ করে। Spring কন্টেইনার বিভিন্ন ধরনের Beans তৈরি এবং পরিচালনা করতে পারে, যেমন Service Beans, Repository Beans, Controller Beans ইত্যাদি।

Bean এর ডিফিনিশন

Spring এ Beans সাধারণত @Component, @Service, @Repository, এবং @Controller এনোটেশন ব্যবহার করে তৈরি করা হয়। এই এনোটেশনগুলোর মাধ্যমে Spring অবজেক্টগুলোকে কন্টেইনারে ডিফাইন করে এবং তারপর সেই Beans গুলোকে বিভিন্ন জায়গায় ইনজেক্ট করা হয়।

  • @Component: একটি সাধারণ Bean তৈরি করতে ব্যবহৃত হয়।
  • @Service: সেবা সম্পর্কিত Beans তৈরি করতে ব্যবহৃত হয়।
  • @Repository: ডেটাবেস সম্পর্কিত Beans তৈরি করতে ব্যবহৃত হয়।
  • @Controller: ওয়েব কন্ট্রোলার Beans তৈরি করতে ব্যবহৃত হয়।

Bean তৈরি করার উদাহরণ:

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class MyBean {

    public String getMessage() {
        return "Hello from MyBean!";
    }
}

এইভাবে @Component ব্যবহার করে একটি সাধারণ Bean তৈরি করা হয়েছে। এখন এই Bean কে অন্য কোথাও ইনজেক্ট করা যেতে পারে।


সারাংশ

Spring Boot এর Dependency Injection (DI) এবং Beans ব্যবস্থাপনা অ্যাপ্লিকেশন ডেভেলপমেন্টকে আরও সহজ, মডুলার এবং টেস্টযোগ্য করে তোলে। DI এর মাধ্যমে অবজেক্টগুলির মধ্যে সম্পর্ক সহজে স্থাপন করা যায় এবং কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়। Beans এর মাধ্যমে Spring কন্টেইনার অবজেক্টগুলির লাইফ সাইকেল এবং ব্যবস্থাপনা সহজভাবে পরিচালনা করে। Spring Boot এ @Autowired, @Service, @Repository, @Component এবং @Controller এনোটেশন ব্যবহার করে DI এবং Beans ব্যবস্থাপনা করা হয়।

Content added By

Dependency Injection কি এবং এর ভূমিকা

341

Spring Boot-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ কনসেপ্ট, যা ইন্টারঅপেবিলিটি, কোডের পুনঃব্যবহারযোগ্যতা, এবং টেস্টেবিলিটি বৃদ্ধির জন্য ব্যবহৃত হয়। এটি Spring Framework-এর একটি মূল উপাদান, যা অটোমেটিকভাবে ডিপেনডেন্সি (অথবা নির্ভরতা) ইনজেক্ট করার মাধ্যমে অবজেক্ট গুলোর মধ্যে সম্পর্ক স্থাপন করে।


Dependency Injection-এর ব্যাখ্যা

Dependency Injection একটি ডিজাইন প্যাটার্ন (Design Pattern) যা কোনো ক্লাসের নির্ভরতা (dependencies) বাহ্যিকভাবে ইনজেক্ট (inject) করার মাধ্যমে কোডের যান্ত্রিকতা (complexity) কমায়। এটি সাধারণত অজানা বা পরিবর্তনশীল উপাদানগুলোর সাথে যোগাযোগের জন্য ব্যবহৃত হয়।

DI-এর মূল ধারণা

একটি ক্লাস যখন অন্য কোনো ক্লাসের উপর নির্ভর করে (অথবা অন্য ক্লাসের কার্যকারিতা ব্যবহার করে), তখন তার ওপর নির্ভরশীল অবজেক্টগুলিকে ওই ক্লাসের কন্সট্রাক্টর, মেথড, অথবা ফিল্ডের মাধ্যমে ইনজেক্ট করা হয়। এটি একটি ইনভার্সন অব কন্ট্রোল (Inversion of Control) প্রক্রিয়া, যেখানে ডিপেনডেন্সি ম্যানেজমেন্ট সরাসরি প্রোগ্রামারের হাতে না রেখে, ফ্রেমওয়ার্ক বা কন্টেইনারের হাতে তুলে দেওয়া হয়।


Dependency Injection-এর ভূমিকা

Spring Boot-এ Dependency Injection ব্যবহারের কয়েকটি গুরুত্বপূর্ণ ভূমিকা রয়েছে:

1. কোডের নমনীয়তা বৃদ্ধি

DI কোডের নমনীয়তা (flexibility) বৃদ্ধি করে, কারণ এতে ক্লাসগুলো তাদের নির্ভরতা সম্পর্কে কিছু জানে না। ক্লাসটি তার নির্ভরতাগুলোর সাথে কাজ করতে পারে যেগুলো বাহ্যিকভাবে ইনজেক্ট করা হয়েছে। এতে কোডের মধ্যকার জড়তা কমে যায় এবং এটি অনেক বেশি পুনঃব্যবহারযোগ্য হয়।

  • উদাহরণ: যদি আপনার অ্যাপ্লিকেশনটি একাধিক ডেটাবেস ব্যবহার করে, তবে Spring DI আপনাকে বিভিন্ন ডেটাবেসের জন্য আলাদা ইমপ্লিমেন্টেশন ইনজেক্ট করার সুযোগ দেয়।

2. টেস্টিং সহজ করা

DI ব্যবহারের ফলে কোড টেস্ট করা অনেক সহজ হয়। কারণ ক্লাসগুলো নির্ভরতা (dependencies) বাহ্যিকভাবে পায়, তাই আপনি সহজেই মক (mock) অবজেক্ট ব্যবহার করে টেস্টিং করতে পারবেন। এটি unit testing এবং integration testing সহজ করে তোলে।

  • উদাহরণ: যদি একটি সার্ভিস ক্লাসের মধ্যে একটি রিপোজিটরি ডিপেনডেন্সি থাকে, তবে আপনি পরীক্ষার জন্য মক রিপোজিটরি ইনজেক্ট করতে পারেন, যা আসল ডেটাবেসের পরিবর্তে টেস্ট ডেটা ব্যবহার করবে।

3. কোডের পুনঃব্যবহারযোগ্যতা

DI ক্লাসগুলোকে তাদের নির্ভরতাগুলি ইনজেক্ট করার মাধ্যমে পুনঃব্যবহারযোগ্য করে তোলে। এর ফলে কোডের মধ্যে পুনরাবৃত্তি কমে যায় এবং একাধিক জায়গায় একই কোড ব্যবহার করা সম্ভব হয়।

  • উদাহরণ: আপনি একই সার্ভিস ইন্টারফেস ব্যবহার করে বিভিন্ন বাস্তবায়ন (implementation) তৈরি করতে পারেন এবং Spring DI সেগুলোকে নির্ভরশীল ক্লাসে ইনজেক্ট করতে পারে।

4. লোজিকাল অ্যাবস্ট্রাকশন তৈরি

DI কোডের মধ্যে অ্যাবস্ট্রাকশন (abstraction) তৈরি করে, যার মাধ্যমে একাধিক অবজেক্টের মধ্যে লজিকাল সম্পর্ক সহজে পরিচালিত হতে পারে। এর ফলে কোডের জটিলতা হ্রাস পায় এবং কাজ করা সহজ হয়।

5. কোডের পুনর্গঠন ও রক্ষণাবেক্ষণ সহজ

DI কোডের ফাংশনালিটি এবং সিস্টেমের অংশগুলোর মধ্যে সম্পর্ক পরিষ্কার করে, যা কোড পুনর্গঠন বা রক্ষণাবেক্ষণের জন্য সহায়ক। আপনি যখন একটি নির্ভরতা পরিবর্তন করবেন, তখন শুধুমাত্র সেই নির্ভরতাটির ইমপ্লিমেন্টেশন পরিবর্তন করতে হবে, বাকি কোড অপরিবর্তিত থাকবে।


Spring Boot-এ Dependency Injection এর উদাহরণ

Spring Boot-এ DI সাধারণত কনস্ট্রাকটর ইনজেকশন, ফিল্ড ইনজেকশন, অথবা সেটটার ইনজেকশনের মাধ্যমে করা হয়।

1. কনস্ট্রাকটর ইনজেকশন (Constructor Injection)

এটি Spring-এ সবচেয়ে পছন্দসই এবং সুপারিশকৃত পদ্ধতি। কনস্ট্রাকটর ইনজেকশনে নির্ভরতাগুলো কনস্ট্রাকটর প্যারামিটার হিসেবে ইনজেক্ট করা হয়।

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

এখানে, UserRepository একটি নির্ভরতা, যা UserService ক্লাসের কনস্ট্রাকটর দিয়ে ইনজেক্ট করা হচ্ছে।

2. ফিল্ড ইনজেকশন (Field Injection)

ফিল্ড ইনজেকশনে সরাসরি ক্লাসের ফিল্ডে @Autowired অ্যনোটেশন দিয়ে নির্ভরতাগুলি ইনজেক্ট করা হয়।

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

এই পদ্ধতিতে @Autowired এর মাধ্যমে নির্ভরতাগুলি সরাসরি ফিল্ডে ইনজেক্ট করা হয়। তবে এটি কনস্ট্রাকটর ইনজেকশনের তুলনায় কম সুপারিশকৃত, কারণ এটি টেস্টিং এবং ডিবাগিংয়ে কিছু সমস্যা তৈরি করতে পারে।

3. সেটটার ইনজেকশন (Setter Injection)

সেটটার ইনজেকশনে, DI পদ্ধতিটি set মেথডের মাধ্যমে নির্ভরতাগুলি ইনজেক্ট করে।

@Service
public class UserService {
    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

এখানে, UserRepository ক্লাসটি setUserRepository মেথডের মাধ্যমে ইনজেক্ট করা হচ্ছে।


Dependency Injection-এর সুবিধা

  • কম্পোনেন্টের মধ্যে শিথিল সম্পর্ক (Loose Coupling): DI ক্লাসগুলোকে একে অপরের থেকে স্বাধীন রাখে, ফলে কোডের মধ্যে শিথিল সম্পর্ক তৈরি হয় এবং কোডের রক্ষণাবেক্ষণ সহজ হয়।
  • টেস্টিং সহজ করা: DI-র মাধ্যমে মক বা স্টাব অবজেক্ট ব্যবহার করা সহজ হয়, যা টেস্টিংয়ের জন্য সুবিধাজনক।
  • নতুন ফিচার যোগ করা সহজ: নতুন ফিচার বা কাস্টম লজিক যোগ করতে পারা সহজ হয়, কারণ ক্লাসের নির্ভরতাগুলি বাহ্যিকভাবে ইনজেক্ট করা হয়।

সারাংশ
Spring Boot-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ প্রোগ্রামিং ধারণা, যা কোডের নমনীয়তা, পুনঃব্যবহারযোগ্যতা, এবং টেস্টেবিলিটি উন্নত করে। DI কোডের ভেতরের ক্লাসগুলোর মধ্যে শিথিল সম্পর্ক তৈরি করে, যা কোডের রক্ষণাবেক্ষণ এবং টেস্টিং সহজ করে তোলে। Spring Framework এই প্যাটার্নকে খুবই কার্যকরভাবে প্রয়োগ করে, এবং এটি Spring Boot অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ।

Content added By

Spring Bean কি এবং এর Lifecycle

386

Spring Framework একটি শক্তিশালী এবং জনপ্রিয় জাভা ফ্রেমওয়ার্ক যা ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) এবং অ্যাসপেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (Aspect-Oriented Programming - AOP) এর মাধ্যমে অ্যাপ্লিকেশন ডেভেলপমেন্টকে সহজ করে তোলে। Spring Bean একটি Spring IoC (Inversion of Control) কনটেইনারে পরিচালিত অবজেক্ট। Spring Bean হলো একটি সিম্পল জাভা অবজেক্ট (POJO) যা Spring কনটেইনার দ্বারা তৈরি এবং পরিচালিত হয়।

Spring Bean এর Lifecycle এবং ডিপেনডেন্সি ইনজেকশন (DI) মেকানিজম খুবই গুরুত্বপূর্ণ, কারণ এর মাধ্যমে Spring কনটেইনার ডাটা এবং কোডের উপাদানগুলিকে সঠিকভাবে ম্যানেজ করে। Spring Bean এর Life Cycle বুঝতে হলে প্রথমে বুঝতে হবে যে Spring কনটেইনার কীভাবে Bean তৈরি, ব্যবহার, এবং ধ্বংস করে।


Spring Bean এর Life Cycle

Spring Bean এর Life Cycle একটি নির্দিষ্ট ধাপে ধাপে চলে, যা Spring কনটেইনারে Bean এর সৃষ্টি থেকে তার ধ্বংস পর্যন্ত ঘটে। Spring Bean এর Life Cycle সাধারণত নিম্নলিখিত ধাপগুলো অনুসরণ করে:

১. Bean Creation (Bean সৃষ্টিকরণ)

Spring কনটেইনার প্রথমে Bean তৈরি করে। এটি কনফিগারেশন ফাইল বা অ্যানোটেশনের মাধ্যমে কনটেইনারকে জানায় যে কোন Bean তৈরি করতে হবে। Spring কনটেইনার bean ডিফিনিশন অনুযায়ী Bean এর ইনস্ট্যান্স তৈরি করে। এটি প্রথমে ডিফাইন করা কনস্ট্রাক্টর অথবা ডিফল্ট কনস্ট্রাক্টর দ্বারা Bean তৈরি করে।

২. Dependency Injection (ডিপেনডেন্সি ইনজেকশন)

Bean তৈরি হওয়ার পর, Spring কনটেইনার সেই Bean এর জন্য নির্দিষ্ট ডিপেনডেন্সি ইনজেক্ট করে। এটি Setter Injection, Constructor Injection, অথবা Field Injection এর মাধ্যমে হতে পারে। ডিপেনডেন্সি ইনজেকশন মূলত Spring Bean এর মধ্যে প্রয়োজনীয় অবজেক্টগুলো প্রেরণ করার প্রক্রিয়া।

৩. Post-Initialization (পোস্ট-ইনিশিয়ালাইজেশন)

Bean তৈরি হওয়ার পর, এবং ডিপেনডেন্সি ইনজেকশনের পর কিছু কাস্টম ইন্টিগ্রেশন বা ফাংশনালিটি অ্যাড করা যেতে পারে। এই স্টেপে কিছু বিশেষ পদ্ধতি বা @PostConstruct অ্যানোটেশন ব্যবহার করে ইনিশিয়ালাইজেশন প্রক্রিয়া সম্পন্ন করা হয়। এর ফলে আপনি কোনো অতিরিক্ত কনফিগারেশন বা লজিক অ্যাড করতে পারেন।

৪. Bean ব্যবহার

Spring কনটেইনারে থাকা Bean গুলি অ্যাপ্লিকেশনের মধ্যে ব্যবহৃত হয়। Spring কনটেইনার Bean এর উপর নিয়ন্ত্রণ বজায় রাখে, তবে অ্যাপ্লিকেশন পর্যায়ে ব্যবহৃত হলে Bean গুলি কার্যকর হয়। এসময় Bean এর মেথড এবং প্রপার্টি ব্যবহার করা হয়।

৫. Pre-Destroy (প্রী-ডেস্ট্রাকশন)

Spring কনটেইনার Bean কে ধ্বংস করার আগে, আপনি কিছু কাস্টম কোড চালাতে পারেন। এর জন্য @PreDestroy অ্যানোটেশন ব্যবহার করা হয়। এই পদ্ধতি Bean ধ্বংসের আগে প্রয়োজনীয় ক্লিনআপ বা রিসোর্স ফ্রি করতে সহায়তা করে। উদাহরণস্বরূপ, ডাটাবেস সংযোগ বন্ধ বা ফাইল লেখা শেষ করা।

৬. Bean Destruction (Bean ধ্বংস)

Bean এর Lifecycle এর শেষ পর্যায়ে Spring কনটেইনার Bean টি ধ্বংস করে। এটি তখন ঘটে যখন Spring কনটেইনার বন্ধ হয় বা Bean টি আর প্রয়োজন হয় না। Spring কনটেইনার @PreDestroy অথবা destroy-method ব্যবহার করে Bean এর ক্লিনআপ কার্যক্রম সম্পন্ন করে।


Spring Bean Lifecycle Diagram

Spring Bean এর Life Cycle একটি ধাপে ধাপে প্রক্রিয়া, যা সহজেই গ্রাফিক্যালি দেখানো যেতে পারে। এই লাইফ সাইকেলটি প্রধানত Bean Creation থেকে Bean Destruction পর্যন্ত চলে।

  1. Bean Creation: Bean তৈরি করা হয়।
  2. Dependency Injection: ডিপেনডেন্সি ইনজেক্ট করা হয়।
  3. Post-Initialization: যেকোনো অতিরিক্ত কনফিগারেশন বা লজিক প্রয়োগ।
  4. Bean Usage: অ্যাপ্লিকেশনের মধ্যে Bean ব্যবহার করা হয়।
  5. Pre-Destroy: Bean ধ্বংসের আগে প্রাক-ধ্বংস কার্যক্রম।
  6. Bean Destruction: Bean ধ্বংস করা হয়।

Spring Bean এর Life Cycle এর বিভিন্ন স্টেপ

১. Bean Initialization

Spring Bean তৈরি হওয়ার পরে এবং এর ডিপেনডেন্সি ইনজেকশনের পরে Bean Initialization ঘটে। Spring এর InitializingBean ইন্টারফেস অথবা @PostConstruct অ্যানোটেশন ব্যবহার করে ইনিশিয়ালাইজেশন কার্যক্রম পরিচালিত হয়।

import javax.annotation.PostConstruct;

@Component
public class ExampleBean {

    @PostConstruct
    public void init() {
        // Bean initialization code
        System.out.println("Bean initialized!");
    }
}

২. Bean Destruction

Bean ধ্বংস হওয়ার সময় @PreDestroy অ্যানোটেশন বা DisposableBean ইন্টারফেস ব্যবহার করা যেতে পারে। এটি রিসোর্স মুক্ত করার জন্য ব্যবহার হয়।

import javax.annotation.PreDestroy;

@Component
public class ExampleBean {

    @PreDestroy
    public void cleanup() {
        // Bean destruction code
        System.out.println("Bean destroyed!");
    }
}

সারাংশ

Spring Bean হলো Spring কনটেইনার দ্বারা তৈরি ও পরিচালিত একটি জাভা অবজেক্ট, যা ডিপেনডেন্সি ইনজেকশনের মাধ্যমে অ্যাপ্লিকেশনে ব্যবহৃত হয়। Spring Bean এর Lifecycle একটি নির্দিষ্ট ধাপে চলে, যা Bean এর তৈরি থেকে ধ্বংস পর্যন্ত হয়। Bean এর Life Cycle এর মধ্যে Bean Creation, Dependency Injection, Post-Initialization, Bean Usage, Pre-Destroy এবং Bean Destruction অন্তর্ভুক্ত। Spring Bean এর Life Cycle বুঝে ব্যবহার করলে Spring অ্যাপ্লিকেশনটি আরও কার্যকর এবং রক্ষণাবেক্ষণযোগ্য হয়।

Content added By

@Component, @Service, এবং @Repository এর ব্যবহার

345

স্প্রিং বুট (Spring Boot) ও স্প্রিং ফ্রেমওয়ার্কে, @Component, @Service, এবং @Repository অ্যানোটেশনগুলো ডিপেনডেন্সি ইনজেকশন (Dependency Injection) এর জন্য ব্যবহৃত হয়। এগুলো স্প্রিং কন্টেইনারে ক্লাসকে একটি বিইন (bean) হিসেবে চিহ্নিত করে, যাতে স্প্রিং কন্টেইনার ঐ ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং প্রয়োজনীয় স্থানে ইনজেক্ট করতে পারে। যদিও এই তিনটি অ্যানোটেশন একই কাজ করে, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে, যেগুলো সঠিকভাবে ব্যবহার করলে স্প্রিং অ্যাপ্লিকেশনের কাঠামো আরও পরিষ্কার এবং সংগঠিত হয়।


@Component

@Component হল স্প্রিং ফ্রেমওয়ার্কের একটি সাধারণ অ্যানোটেশন যা কোনো ক্লাসকে একটি স্প্রিং বিইন (Spring Bean) হিসেবে চিহ্নিত করে। এটি ক্লাসের জন্য কোনো নির্দিষ্ট ভূমিকা নির্ধারণ করে না, শুধুমাত্র স্প্রিং কন্টেইনারকে জানায় যে এটি একটি বিইন হতে পারে। অন্য সব অ্যানোটেশন যেমন @Service এবং @Repository আসলে @Component এর বিশেষায়িত ফর্ম, যেগুলো নির্দিষ্ট ধরণের বিইনের জন্য ব্যবহৃত হয়।

উদাহরণ:

import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

এখানে, MyComponent ক্লাসটি @Component অ্যানোটেশনের মাধ্যমে স্প্রিং কন্টেইনারে একটি বিইন হিসেবে চিহ্নিত হয়েছে এবং যেখানে প্রয়োজন সেখানে এটি ইনজেক্ট করা যাবে।


@Service

@Service অ্যানোটেশনটি মূলত সার্ভিস লেয়ারের জন্য ব্যবহৃত হয়, যেখানে ব্যবসায়িক (business) লজিক বা বাণিজ্যিক কাজ করা হয়। যদিও @Service ক্লাসের কার্যক্রম @Component এর মতোই, এটি সাধারণত পরিষ্কারভাবে সার্ভিস লেয়ারকে চিহ্নিত করতে ব্যবহৃত হয়। এটি স্প্রিং কন্টেইনারের কাছে আরও স্পষ্টভাবে বলে দেয় যে এটি ব্যবসায়িক লজিক সম্পর্কিত একটি বিইন।

উদাহরণ:

import org.springframework.stereotype.Service;

@Service
public class MyService {
    public String processData(String data) {
        return "Processed: " + data;
    }
}

এখানে, MyService ক্লাসটি একটি ব্যবসায়িক লজিকের ক্লাস, যা @Service অ্যানোটেশন দিয়ে চিহ্নিত করা হয়েছে। স্প্রিং কন্টেইনারে এটি একটি সার্ভিস বিইন হিসেবে ব্যবহৃত হবে।


@Repository

@Repository অ্যানোটেশনটি সাধারণত ডেটাবেস অপারেশন পরিচালনার জন্য ব্যবহৃত হয়। এটি সাধারণত ডেটা অ্যাক্সেস লেয়ারের জন্য ব্যবহৃত হয় এবং স্প্রিং ডেটা বা JPA রেপোজিটরি ক্লাসগুলির জন্য উপযুক্ত। @Repository অ্যানোটেশনটি কিছু অতিরিক্ত ফিচার প্রদান করে, যেমন ডেটাবেস এক্সসেপশনকে স্প্রিংয়ের ডেটাবেস সম্পর্কিত এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে কনভার্ট করা (convert) এবং অ্যাসিস্ট করা।

উদাহরণ:

import org.springframework.stereotype.Repository;

@Repository
public class MyRepository {
    public String getDataFromDatabase() {
        // Example database access logic
        return "Data from database";
    }
}

এখানে, MyRepository ক্লাসটি ডেটাবেস থেকে তথ্য প্রাপ্তির জন্য ব্যবহৃত হচ্ছে এবং এটি @Repository অ্যানোটেশনের মাধ্যমে স্প্রিং কন্টেইনারে একটি রেপোজিটরি বিইন হিসেবে চিহ্নিত করা হয়েছে।


@Component, @Service, @Repository এর পার্থক্য

  • @Component: এটি একটি সাধারণ অ্যানোটেশন যা কোনো ক্লাসকে স্প্রিং কন্টেইনারে একটি বিইন হিসেবে চিহ্নিত করে। এটি সাধারণ ব্যবহারের জন্য এবং কোনো বিশেষ ধরনের ক্লাসের জন্য নির্ধারিত নয়।
  • @Service: এটি বিশেষভাবে সার্ভিস লেয়ার বা ব্যবসায়িক লজিক সম্পর্কিত ক্লাসের জন্য ব্যবহৃত হয়। এটি সাধারণত @Component এর বিশেষায়িত ফর্ম, যেখানে ক্লাসটির ভূমিকা পরিষ্কারভাবে ব্যবসায়িক লজিকের ক্লাস।
  • @Repository: এটি ডেটা অ্যাক্সেস লেয়ারের জন্য ব্যবহৃত হয় এবং এটি ডেটাবেস এক্সসেপশন হ্যান্ডলিং এবং অন্যান্য ডেটাবেস সম্পর্কিত কার্যক্রমের জন্য উপযোগী। এটি @Component এর বিশেষায়িত ফর্ম, কিন্তু ডেটাবেস সংক্রান্ত কার্যক্রমের জন্য অতিরিক্ত সুবিধা প্রদান করে।

সারাংশ

স্প্রিং বুটে @Component, @Service, এবং @Repository অ্যানোটেশনগুলো মূলত একই কাজ করে, কিন্তু তাদের ব্যবহারের ক্ষেত্রে নির্দিষ্ট পার্থক্য রয়েছে। @Component সাধারণ বিইন তৈরি করতে ব্যবহৃত হয়, @Service ব্যবসায়িক লজিকের জন্য এবং @Repository ডেটাবেস বা ডেটা অ্যাক্সেস লেয়ারের জন্য ব্যবহৃত হয়। এই অ্যানোটেশনগুলির সাহায্যে স্প্রিং কন্টেইনারে ডিপেনডেন্সি ইনজেকশন এবং বিইন ম্যানেজমেন্ট কার্যক্রম আরও সংগঠিত এবং পরিষ্কারভাবে পরিচালিত হয়।

Content added By

উদাহরণ সহ Bean তৈরি এবং পরিচালনা

279

Spring Boot একটি শক্তিশালী ফ্রেমওয়ার্ক, যা ডিপেনডেন্সি ইনজেকশন (DI) এর মাধ্যমে অ্যাপ্লিকেশন ডেভেলপমেন্ট সহজ করে তোলে। Spring এর Bean হল একটি অবজেক্ট, যা Spring Container দ্বারা ম্যানেজ করা হয়। Spring Boot অ্যাপ্লিকেশনে, Beans তৈরি করা এবং পরিচালনা করা সহজ এবং স্বয়ংক্রিয়ভাবে ঘটে।

এখানে, Spring Boot এ Bean তৈরি ও পরিচালনা করার একটি সাধারণ উদাহরণ দেওয়া হবে।


Spring Bean কি?

Spring Bean হল একটি অবজেক্ট যা Spring Framework দ্বারা তৈরি এবং পরিচালিত হয়। Spring Container এটি তৈরি করে, কনফিগারেশন প্রদান করে এবং প্রয়োজনীয় সময় এটি ইনজেক্ট করে। Spring Boot অ্যাপ্লিকেশনে Beans সাধারণত @Component, @Service, @Repository, এবং @Controller অ্যানোটেশন দ্বারা তৈরি হয়।


1. Bean তৈরি করার উদাহরণ

Spring Boot অ্যাপ্লিকেশনে Bean তৈরি করতে, আমরা সাধারণত @Component অ্যানোটেশন ব্যবহার করি। এটি Spring Boot কে বলে দেয় যে এই ক্লাসটি একটি Bean এবং Spring Container এ এটি তৈরি হতে হবে।

1.1 Service Bean তৈরি

ধরা যাক আমাদের একটি UserService ক্লাস আছে, যা ইউজার সম্পর্কিত ব্যবসায়িক লজিক পরিচালনা করবে। আমরা এই ক্লাসটিকে একটি Bean হিসেবে তৈরি করতে @Service অ্যানোটেশন ব্যবহার করতে পারি।

package com.example.helloworld.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getUserInfo() {
        return "User: John Doe, Email: john.doe@example.com";
    }
}

এখানে, @Service অ্যানোটেশন Spring Boot কে বলে যে UserService ক্লাসটি একটি Service Bean এবং এটি Spring Container দ্বারা ম্যানেজ হবে।


2. Bean ইনজেকশন (Dependency Injection)

Spring Framework এর অন্যতম প্রধান সুবিধা হল Dependency Injection (DI)। Spring Container স্বয়ংক্রিয়ভাবে Bean গুলি ইনজেক্ট করে দেয়, যাতে কোডে নির্ভরশীলতা কমে যায় এবং সফটওয়্যারটি আরও মডুলার ও টেস্টেবল হয়।

2.1 Constructor Injection

Spring Boot এ Bean ইনজেক্ট করার বিভিন্ন পদ্ধতি রয়েছে। এখানে Constructor Injection ব্যবহার করা হবে।

package com.example.helloworld.controller;

import com.example.helloworld.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user")
    public String getUserInfo() {
        return userService.getUserInfo();
    }
}

এখানে, @Autowired অ্যানোটেশনটি Spring Boot কে বলে যে UserService Beanটি UserController ক্লাসে ইনজেক্ট করতে হবে। Constructor Injection পদ্ধতিতে Bean ইনজেকশন করা হয়েছে।


2.2 Setter Injection

একটি বিকল্প পদ্ধতি হল Setter Injection, যেখানে ইনজেকশন প্রক্রিয়া Setter মেথডের মাধ্যমে সম্পন্ন করা হয়।

package com.example.helloworld.controller;

import com.example.helloworld.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user")
    public String getUserInfo() {
        return userService.getUserInfo();
    }
}

এখানে, setUserService() মেথডের মাধ্যমে UserService Bean ইনজেক্ট করা হয়েছে।


3. Bean ম্যানেজমেন্ট

Spring Boot আপনার Bean গুলি Spring Container (ApplicationContext) দ্বারা ম্যানেজ করে। আপনি Bean গুলি সরাসরি তৈরি না করে Spring Context থেকে আনতে পারেন।

3.1 Bean ম্যানেজমেন্ট উদাহরণ

Spring Boot অ্যাপ্লিকেশনে, আপনি ApplicationContext ব্যবহার করে Bean গুলির অ্যাক্সেস পেতে পারেন।

package com.example.helloworld;

import com.example.helloworld.service.UserService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class HelloWorldApplication implements CommandLineRunner {

    private final ApplicationContext context;

    public HelloWorldApplication(ApplicationContext context) {
        this.context = context;
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Bean নেওয়া হচ্ছে Spring Context থেকে
        UserService userService = context.getBean(UserService.class);
        System.out.println(userService.getUserInfo());
    }
}

এখানে, ApplicationContext ব্যবহার করে UserService Bean এর একটি ইন্সট্যান্স নিয়ে তার মেথড কল করা হয়েছে।


4. Bean এর লাইফসাইকেল

Spring Framework এ Bean এর একটি নির্দিষ্ট লাইফসাইকেল থাকে। Spring Container Bean তৈরি করে, সেটির ইনজেকশন সম্পন্ন করে এবং প্রয়োজন হলে ডেস্ট্রয় করে। আপনি Bean এর লাইফসাইকেল কাস্টমাইজ করতে @PostConstruct এবং @PreDestroy অ্যানোটেশন ব্যবহার করতে পারেন।

4.1 @PostConstruct এবং @PreDestroy উদাহরণ

package com.example.helloworld.service;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class UserService {

    @PostConstruct
    public void init() {
        System.out.println("UserService Bean তৈরি হয়েছে");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("UserService Bean ধ্বংস করা হচ্ছে");
    }

    public String getUserInfo() {
        return "User: John Doe, Email: john.doe@example.com";
    }
}

এখানে, @PostConstruct মেথডটি Bean তৈরি হওয়ার পর কল হয়, এবং @PreDestroy মেথডটি Bean ধ্বংস হওয়ার আগে কল হয়।


সারাংশ

Spring Boot অ্যাপ্লিকেশনে Bean তৈরি ও পরিচালনা করা সহজ এবং অত্যন্ত কার্যকর। @Service, @Component বা অন্যান্য অ্যানোটেশন ব্যবহার করে Bean তৈরি করা যায় এবং Dependency Injection এর মাধ্যমে তাদের ইনজেক্ট করা হয়। আপনি Constructor Injection বা Setter Injection পদ্ধতি ব্যবহার করতে পারেন। Spring Container Bean গুলির জীবনচক্র (Lifecycle) পরিচালনা করে, এবং প্রয়োজনে @PostConstruct@PreDestroy অ্যানোটেশন ব্যবহার করে Bean এর কাস্টম লাইফসাইকেল ম্যানেজ করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...