CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-alibaba--druid-spring-boot-starter

Spring Boot starter that provides auto-configuration and integration support for Alibaba Druid database connection pool and monitoring system.

Pending
Overview
Eval results
Files

datasource-management.mddocs/

DataSource Management

The Druid Spring Boot Starter provides DataSource creation, configuration, and lifecycle management through wrapper classes and builder patterns.

Capabilities

DruidDataSourceWrapper

A Spring Boot-integrated wrapper around DruidDataSource that provides automatic property binding and initialization.

/**
 * Spring Boot wrapper for DruidDataSource with automatic configuration
 * Extends DruidDataSource and implements InitializingBean for lifecycle management
 */
@ConfigurationProperties("spring.datasource.druid")
public class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {
    
    /**
     * Initializes the DataSource after all properties are set
     * Falls back to basic Spring Boot DataSource properties when Druid-specific properties are not set
     * Calls DruidDataSource.init() to complete initialization
     * @throws Exception if initialization fails
     */
    void afterPropertiesSet() throws Exception;
    
    /**
     * Automatically registers available Druid filters with the DataSource
     * @param filters List of Filter beans to be added to the DataSource
     */
    @Autowired(required = false)
    void autoAddFilters(List<Filter> filters);
    
    /**
     * Sets maximum evictable idle time with validation bypass
     * Bypasses IllegalArgumentException for configuration order issues
     * @param maxEvictableIdleTimeMillis Maximum idle time in milliseconds
     */
    void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis);
}

Key Features:

  • Property Binding: Automatically binds properties with prefix spring.datasource.druid
  • Fallback Configuration: Uses standard Spring Boot DataSource properties when Druid-specific ones aren't set
  • Filter Auto-Registration: Automatically adds any Druid Filter beans found in the Spring context
  • Validation Workaround: Handles property validation edge cases for better Spring Boot integration

Usage Example:

The wrapper is typically created automatically by the auto-configuration, but you can also create it manually:

@Bean
@ConfigurationProperties("spring.datasource.druid.primary")
public DruidDataSourceWrapper primaryDataSource() {
    return new DruidDataSourceWrapper();
}

DruidDataSourceBuilder

Builder pattern utility for creating DruidDataSource instances, particularly useful for multiple DataSource configurations.

/**
 * Builder utility for creating DruidDataSource instances
 * Provides fluent API for DataSource creation
 */
public class DruidDataSourceBuilder {
    
    /**
     * Creates a new DruidDataSourceBuilder instance
     * @return New builder instance
     */
    static DruidDataSourceBuilder create();
    
    /**
     * Builds a new DruidDataSourceWrapper instance
     * @return Configured DruidDataSourceWrapper ready for use
     */
    DruidDataSource build();
    
    /**
     * @deprecated Legacy method for Spring Boot 1.x compatibility
     * Builds DruidDataSource with environment-specific configuration
     * Fixed property ordering issues in older Spring Boot versions
     * @param env Spring Environment for property resolution
     * @param prefix Configuration property prefix
     * @return Configured DruidDataSource
     */
    @Deprecated
    DruidDataSource build(Environment env, String prefix);
}

Usage Examples:

Single DataSource:

@Bean
public DataSource dataSource() {
    return DruidDataSourceBuilder.create().build();
}

Multiple DataSources:

@Configuration
public class MultiDataSourceConfig {
    
    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.druid.primary")
    public DataSource primaryDataSource() {
        return DruidDataSourceBuilder.create().build();
    }
    
    @Bean  
    @ConfigurationProperties("spring.datasource.druid.secondary")
    public DataSource secondaryDataSource() {
        return DruidDataSourceBuilder.create().build();
    }
}

Property Resolution Logic

The DruidDataSourceWrapper follows a specific property resolution hierarchy:

  1. Druid-specific properties (e.g., spring.datasource.druid.username)
  2. Standard Spring Boot properties (e.g., spring.datasource.username) as fallback
/**
 * Property resolution order in afterPropertiesSet():
 * 1. Check if Druid-specific property is set
 * 2. If not, fall back to standard Spring Boot DataSource property
 * 3. Apply the resolved value to the DruidDataSource
 */
void afterPropertiesSet() throws Exception {
    if (super.getUsername() == null) {
        super.setUsername(basicProperties.determineUsername());
    }
    if (super.getPassword() == null) {
        super.setPassword(basicProperties.determinePassword());
    }
    // ... similar for URL and driver class name
    init(); // Complete DruidDataSource initialization
}

Filter Integration

The wrapper automatically integrates with Druid's filter system:

/**
 * Automatic filter registration
 * Any Filter beans in the Spring context are automatically added to the DataSource
 * Supports conditional filter registration based on configuration
 */
@Autowired(required = false)
public void autoAddFilters(List<Filter> filters) {
    super.filters.addAll(filters);
}

Supported Filter Types:

  • StatFilter (SQL execution statistics)
  • WallFilter (SQL injection protection)
  • ConfigFilter (Encrypted password support)
  • EncodingConvertFilter (Character encoding conversion)
  • Slf4jLogFilter, Log4jFilter, Log4j2Filter, CommonsLogFilter (Logging integration)

Multiple DataSource Configuration

For applications requiring multiple DataSources, configure separate property prefixes:

Properties Configuration:

# Primary DataSource
spring.datasource.druid.primary.url=jdbc:mysql://localhost:3306/primary
spring.datasource.druid.primary.username=primary_user
spring.datasource.druid.primary.password=primary_pass
spring.datasource.druid.primary.initial-size=5
spring.datasource.druid.primary.max-active=20

# Secondary DataSource  
spring.datasource.druid.secondary.url=jdbc:mysql://localhost:3306/secondary
spring.datasource.druid.secondary.username=secondary_user
spring.datasource.druid.secondary.password=secondary_pass
spring.datasource.druid.secondary.initial-size=3
spring.datasource.druid.secondary.max-active=10

Java Configuration:

@Configuration
public class DataSourceConfig {
    
    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties("spring.datasource.druid.primary")
    public DataSource primaryDataSource() {
        return DruidDataSourceBuilder.create().build();
    }
    
    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties("spring.datasource.druid.secondary")
    public DataSource secondaryDataSource() {
        return DruidDataSourceBuilder.create().build();
    }
}

Lifecycle Management

The DruidDataSourceWrapper properly integrates with Spring's bean lifecycle:

  1. Construction: Bean is created with default values
  2. Property Injection: Spring injects configured properties
  3. afterPropertiesSet(): Fallback properties are applied and DruidDataSource is initialized
  4. Bean Ready: DataSource is ready for dependency injection and use
  5. Destruction: Spring handles cleanup when application context closes

Install with Tessl CLI

npx tessl i tessl/maven-com-alibaba--druid-spring-boot-starter

docs

auto-configuration.md

configuration-properties.md

datasource-management.md

filter-configuration.md

index.md

monitoring-integration.md

tile.json