Auto-Configuration
@EnableAutoConfiguration (jo @SpringBootApplication ke andar included hai) CLASSPATH scan karta hai aur DECIDE karta hai kya configure karna hai. Agar spring-boot-starter-data-jpa aur H2 database classpath par hain, Spring Boot AUTOMATICALLY ek DataSource, EntityManagerFactory, aur TransactionManager bana deta hai — bina EK LINE code likhे.
Ye "magic" CONDITIONAL annotations se kaam karta hai internally — @ConditionalOnClass (agar ye class classpath par hai), @ConditionalOnMissingBean (agar user ne khud ye bean nahi banayi), @ConditionalOnProperty (agar ek specific property set hai).
// Bina auto-configuration ke, manually likhna padta:
@Bean
public DataSource dataSource() {
return DataSourceBuilder.create()
.url("jdbc:h2:mem:testdb")
.driverClassName("org.h2.Driver")
.build();
}
// Spring Boot ke saath — bas dependency add karo, KUCH bhi likhne ki zaroorat nahi:
// (H2 + starter-data-jpa classpath par hai → DataSource AUTOMATICALLY ban jaata hai)- Classpath dekh ke automatically beans configure karta hai
- @ConditionalOnClass/@ConditionalOnMissingBean internally use hote hain
- Khud ek bean define karne par, auto-configuration BACK OFF ho jaata hai
@EnableAutoConfiguration classpath par PRESENT libraries DEKH ke DECIDE karta hai kya configure karna hai — agar H2 database JAR classpath par hai, Spring Boot AUTOMATICALLY ek in-memory DataSource bean bana deta hai. Ye "CONDITIONAL" configuration hai — @ConditionalOnClass, @ConditionalOnMissingBean jaise annotations internally use hote hain.
// Internally, Spring Boot ke andar (simplified):
@Configuration
@ConditionalOnClass(DataSource.class) // sirf agar DataSource classpath par hai
@ConditionalOnMissingBean(DataSource.class) // sirf agar user ne khud DataSource nahi banaya
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() { /* sensible default */ }
}Agar tum KHUD ek bean define karo (jaise apna custom DataSource @Bean method), Spring Boot ka auto-configuration AUTOMATICALLY BACK OFF ho jaata hai us bean ke liye (@ConditionalOnMissingBean ki wajah se) — tumhari definition PRIORITY leti hai.