@Conditional Annotations Family
Spring Boot MULTIPLE @Conditional* annotations DETA hai, JO auto-configuration ke FOUNDATION hain — @ConditionalOnClass (agar EK SPECIFIC class classpath par PRESENT hai), @ConditionalOnMissingBean (agar USER ne KHUD ye bean NAHI banayi), @ConditionalOnProperty (agar EK SPECIFIC property SET hai, EK SPECIFIC value ke saath), @ConditionalOnWebApplication (agar application EK WEB app hai).
Ye annotations APNI KHUD KI classes/beans PAR bhi LAGAI ja sakti hain — SIRF Spring Boot ke INTERNAL auto-configuration tak LIMITED nahi hain. Isse APNA khud ka "CONDITIONAL BEAN CREATION" LOGIC likh sakte ho, jaise ENVIRONMENT-specific ya FEATURE-FLAG-based beans.
@Configuration
public class FeatureConfig {
@Bean
@ConditionalOnProperty(name = "app.email.provider", havingValue = "sendgrid")
public EmailService sendGridEmailService() {
return new SendGridEmailService();
}
@Bean
@ConditionalOnProperty(name = "app.email.provider", havingValue = "ses", matchIfMissing = true)
public EmailService sesEmailService() {
return new SesEmailService(); // DEFAULT, agar property set nahi hai
}
}- @ConditionalOnClass = classpath par SPECIFIC class present honi CHAHIYE
- @ConditionalOnMissingBean = user NE khud bean NAHI banayi honi CHAHIYE
- @ConditionalOnProperty = SPECIFIC property, SPECIFIC value ke saath, SET honi CHAHIYE
@ConditionalOnProperty se, EK bean SIRF TAB create hoti hai jab EK SPECIFIC property SET (ya EK SPECIFIC VALUE) ho — YE "FEATURE FLAG" jaisa PATTERN enable karta hai, application.properties SE features ON/OFF kiye ja sakte hain.
@Bean
@ConditionalOnProperty(name = "app.feature.newSearch", havingValue = "true")
public SearchService newSearchService() {
return new ElasticsearchSearchService();
}
// application.properties: app.feature.newSearch=true (ya false)MULTIPLE @Conditional* annotations EK BEAN par STACK ki ja sakti hain — SAB conditions TRUE honi CHAHIYE, tabhi bean CREATE hogi (AND logic). Complex, CUSTOM conditions ke liye, @Conditional(CustomCondition.class) se APNA khud ka Condition class bhi likh sakte ho.
@Bean
@ConditionalOnClass(RedisTemplate.class)
@ConditionalOnMissingBean(CacheManager.class)
@ConditionalOnProperty(name = "app.cache.enabled", havingValue = "true", matchIfMissing = true)
public CacheManager cacheManager() { /* ... */ }