Component Scanning
@ComponentScan Spring ko batata hai KIS PACKAGE (aur uske sub-packages) mein @Component-annotated classes DHOONDNI hain. Spring Boot mein, @SpringBootApplication automatically is annotation ko INCLUDE karta hai — main class ke PACKAGE se scanning shuru hoti hai.
Isliye Spring Boot mein CONVENTION hai — main application class (jisme @SpringBootApplication hai) ROOT package mein rakho, saari doosri classes (controllers, services, repositories) ISKE sub-packages mein — taaki SAB automatically scan ho jaayein.
com.example.bookstore
├── BookstoreApplication.java ← @SpringBootApplication, YAHA se scanning shuru
├── controller/BookController.java
├── service/BookService.java
└── repository/BookRepository.java
// Sab automatically discover ho jaate hain — koi manual registration nahi chahiye- @ComponentScan = package tree mein @Component classes dhoondta hai
- Spring Boot mein automatic — main class ke package se shuru hota hai
- Convention: main class ROOT package mein rakho
@ComponentScan Spring ko batata hai KAHA @Component (aur uske specializations) DHOONDNE hain — package aur uske sub-packages RECURSIVELY scan hote hain. Spring Boot mein, @SpringBootApplication class ke PACKAGE se scanning shuru hoti hai — isliye main class ko HAMESHA root package mein rakhna best practice hai.
com.example.myapp
├── MyApp.java ← @SpringBootApplication, root package
├── controller/
│ └── UserController.java ← automatically scan hoga
├── service/
│ └── UserService.java ← ye bhi
└── util/ ← agar ye package ALAG tree mein hota, scan NAHI hota@ComponentScan ke filters (includeFilters, excludeFilters) se SPECIFIC classes ko scan mein SHAAMIL ya EXCLUDE kiya ja sakta hai — jaise testing ke liye kuch beans skip karна, ya conditionally kuch classes hi register karna.
@ComponentScan(
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Deprecated.class
)
)