CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-springframework-boot--spring-boot-autoconfigure

Spring Boot AutoConfigure provides auto-configuration capabilities that automatically configure Spring applications based on jar dependencies present on the classpath

Pending
Overview
Eval results
Files

advanced-conditions.mddocs/guides/

Advanced Conditions

Master complex conditional logic in Spring Boot AutoConfigure.

For comprehensive conditional annotation reference, see Conditions Reference.

Complex Condition Patterns

Combining Multiple Conditions

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(prefix = "app.database", name = "enabled")
@ConditionalOnMissingBean(DataSource.class)
public class DatabaseConfiguration {
    // All conditions must match
}

Nested Conditions (OR Logic)

@Configuration
@Conditional(DatabaseConditions.class)
public class StorageConfiguration {
    // Configuration
}

static class DatabaseConditions extends AnyNestedCondition {
    DatabaseConditions() {
        super(ConfigurationPhase.REGISTER_BEAN);
    }
    
    @ConditionalOnProperty(name = "database.type", havingValue = "mysql")
    static class MySQLEnabled {}
    
    @ConditionalOnProperty(name = "database.type", havingValue = "postgresql")
    static class PostgreSQLEnabled {}
}

Custom Conditions

public class OnDatabaseTypeCondition extends SpringBootCondition {
    
    @Override
    public ConditionOutcome getMatchOutcome(
            ConditionContext context,
            AnnotatedTypeMetadata metadata) {
        
        String dbType = context.getEnvironment()
            .getProperty("database.type");
        
        if ("mysql".equals(dbType)) {
            return ConditionOutcome.match(
                ConditionMessage.forCondition("OnDatabaseType")
                    .found("database type").items(dbType)
            );
        }
        
        return ConditionOutcome.noMatch(
            ConditionMessage.forCondition("OnDatabaseType")
                .didNotFind("mysql database type").atAll()
        );
    }
}

Condition Ordering

Order conditions from fastest to slowest:

  1. Classpath checks - Very fast
  2. Property checks - Fast
  3. Bean checks - Slower
  4. Expression evaluation - Slowest
@Configuration
@ConditionalOnClass(DataSource.class)        // Fast
@ConditionalOnProperty("app.enabled")        // Fast
@ConditionalOnBean(DataSource.class)         // Slower
public class OptimizedConfiguration {
    // Conditions evaluated in order
}

Advanced Patterns

All Nested Conditions (AND)

static class AllConditions extends AllNestedConditions {
    AllConditions() {
        super(ConfigurationPhase.REGISTER_BEAN);
    }
    
    @ConditionalOnProperty("feature.enabled")
    static class FeatureEnabled {}
    
    @ConditionalOnClass(name = "com.example.SomeClass")
    static class ClassPresent {}
}

None Nested Conditions (NOR)

static class NoneConditions extends NoneNestedConditions {
    NoneConditions() {
        super(ConfigurationPhase.REGISTER_BEAN);
    }
    
    @ConditionalOnProperty("feature.disabled")
    static class FeatureDisabled {}
    
    @ConditionalOnClass(name = "com.example.ConflictingClass")
    static class ConflictingClassPresent {}
}

Testing Conditions

@Test
void testConditionMatches() {
    contextRunner
        .withPropertyValues("feature.enabled=true")
        .run(context -> {
            assertThat(context).hasBean("featureService");
        });
}

@Test
void testConditionDoesNotMatch() {
    contextRunner
        .withPropertyValues("feature.enabled=false")
        .run(context -> {
            assertThat(context).doesNotHaveBean("featureService");
        });
}

Best Practices

  1. Use Type-Safe Conditions: Prefer specific annotations over expressions
  2. Order for Performance: Fast conditions first
  3. Test All Paths: Test both matching and non-matching scenarios
  4. Document Complex Logic: Explain why conditions are needed
  5. Avoid Early Initialization: Don't reference beans in conditions

See Also

Install with Tessl CLI

npx tessl i tessl/maven-org-springframework-boot--spring-boot-autoconfigure@4.0.1

docs

index.md

tile.json