Spring Boot Auto Configuration


Spring Boot -এর সবচেয়ে শক্তিশালী ও জনপ্রিয় ফিচারগুলোর মধ্যে অন্যতম হলো Auto Configuration. এর মূল উদ্দেশ্য হলো — তোমার প্রজেক্টে কোন কোন dependency ব্যবহার করা হয়েছে, তার ওপর ভিত্তি করে Spring Boot স্বয়ংক্রিয়ভাবে (automatically) প্রয়োজনীয় configuration তৈরি করে দেয়, যাতে তোমাকে বারবার boilerplate কোড লিখতে না হয়।


কেন Auto Configuration দরকার?

ধরা যাক তুমি যদি Spring Data JPA ব্যবহার করতে চাও, তবে তোমাকে আগে থেকে নিচের কাজগুলো করতে হতো:
* একটি DataSource bean তৈরি করতে হতো
* EntityManagerFactory কনফিগার করতে হতো
* TransactionManager ডিফাইন করতে হতো

Spring Boot আসার পর এই কষ্টের দিন শেষ। তুমি শুধু dependency যোগ করো, বাকিটা Spring Boot নিজে থেকেই করে নেবে।


Auto Configuration কিভাবে কাজ করে?

Spring Boot তোমার classpath-এ থাকা dependency গুলো স্ক্যান করে দেখে কোন কোন feature দরকার হতে পারে। তারপর সেই অনুযায়ী predefined configuration ক্লাসগুলো activate করে। এই configuration ক্লাসগুলো Spring Boot নিজে সংরক্ষণ করে রাখে `spring-boot-autoconfigure` মডিউলের ভিতরে।


উদাহরণস্বরূপ, যদি তুমি `spring-boot-starter-web` যোগ করো,
তবে Spring Boot স্বয়ংক্রিয়ভাবে নিচের bean গুলো তৈরি করে:
* DispatcherServlet
* DefaultErrorAttributes
* WebMvcAutoConfiguration
* এবং আরও অনেক কিছু...

উদাহরণ ১: JPA Auto Configuration

pom.xml এ নিচের dependency যোগ করো:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Spring Boot এখন স্বয়ংক্রিয়ভাবে নিচের জিনিসগুলো কনফিগার করে দেবে:

* Embedded H2 database
* DataSource
* EntityManagerFactory
* TransactionManager


তুমি শুধু তোমার Entity ও Repository লিখলেই হবে:

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}
public interface UserRepository extends JpaRepository<User, Long> {
}

এখন Application রান করলেই সবকিছু কাজ করবে, কোনো XML বা manual bean configuration ছাড়াই!


উদাহরণ ২: Web Auto Configuration

তুমি যদি নিচের dependency যোগ করো:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot স্বয়ংক্রিয়ভাবে:
* `Tomcat` (embedded web server)
* `DispatcherServlet`
* `RequestMappingHandlerMapping`
* এবং ডিফল্ট JSON converter (`Jackson`) সেটআপ করে দেবে।

তুমি শুধু Controller লিখলেই চলবে 

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot Auto Configuration!";
    }
}

রান করলে দেখবে, `http://localhost:8080/hello` রেসপন্স দিবে ঠিকই।



উদাহরণ ৩: Custom Auto Configuration তৈরি করা

তুমি চাইলে নিজের Custom Auto Configuration ও তৈরি করতে পারো।
ধরা যাক, তুমি চাও `MyService` নামে একটা bean স্বয়ংক্রিয়ভাবে লোড হোক:

public class MyService {
    public void greet() {
        System.out.println("Hello from MyService!");
    }
}

তাহলে একটা Configuration ক্লাস তৈরি করো 

@Configuration
public class MyServiceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

এরপর `resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` ফাইলে নিচের লাইনটি যোগ করো:

com.example.demo.MyServiceAutoConfiguration

এবার যেই প্রজেক্টে এই JAR dependency হিসেবে যোগ করবে, Spring Boot সেটাকে স্বয়ংক্রিয়ভাবে configure করে ফেলবে।



Auto Configuration Debug করা

তুমি জানতে চাও কোন কোন auto configuration লোড হচ্ছে —
তাহলে `application.properties`-এ নিচেরটা যোগ করো:

debug=true

Spring Boot startup log-এ তুমি দেখতে পাবে:
* কোন কোন auto configuration **enabled**
* কোনগুলো **skipped** হয়েছে এবং কেন