java -自定义Druid-starter

数据源:自定义一个 druid 数据源的 starter

  • 需求:
    • 可以只用一个模块,不区分 starter 和 autoconfiguration
    • starter 可以配置数据源的 url、username、password、maxPoolSize 等常见配置可以用独立前缀,如 druid不用与 spring.datasource 前缀的配置结合
    • 提供 starter 的自动配置类,并做必要配置
    • 如果应用程序配置了 spring-boot-starter-jdbc 或 mybatis-spring-boot-starter 等 starter,它们默认使用 HikariCP 作为数据源,我们的 druid 数据源应当优先级较低,在已经存在 HikariCP 的情况下不创建 dataSource

引用 皆我百晓生 小程序回复内容作答:
要实现自定义的Druid数据源starter,需要进行以下步骤:

  1. 创建一个Maven项目,并在pom.xml文件中添加依赖。需要添加spring-boot-starter、druid、spring-boot-autoconfigure等相关依赖。

  2. 创建自定义的DruidConfiguration类,继承自AbstractDataSourceConfiguration。在该类中,可以通过@ConfigurationProperties注解提供可配置的属性,如url、username、password、maxPoolSize等。

@ConfigurationProperties(prefix = "druid")
public class DruidConfiguration extends AbstractDataSourceConfiguration {
    // 插入定义的属性,如url、username、password、maxPoolSize等
    // ...
}
  1. 创建一个自定义的DruidDataSourceWrapper类,继承自DataSourceWrapper。在该类中,覆盖configureDataSource方法,并使用配置属性创建DruidDataSource实例。
public class DruidDataSourceWrapper extends DataSourceWrapper {
    private final DruidConfiguration configuration;
    
    public DruidDataSourceWrapper(DruidConfiguration configuration) {
        this.configuration = configuration;
    }
    
    @Override
    protected DataSource createDataSource(DataSourceProperties properties) {
        // 创建DruidDataSource实例并配置属性
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(configuration.getUrl());
        dataSource.setUsername(configuration.getUsername());
        dataSource.setPassword(configuration.getPassword());
        dataSource.setMaxActive(configuration.getMaxPoolSize());
        // ...
        
        return dataSource;
    }
}
  1. 创建一个自定义的DruidDataSourceAutoConfiguration类,实现自动配置。在该类中,使用@Configuration注解标注为配置类,使用@ConditionalOnClass注解确保DruidDataSourceWrapper类被加载。通过@Bean注解创建DruidDataSourceWrapper实例,并将其注入到Spring应用程序上下文中。
@Configuration
@ConditionalOnClass(DruidDataSourceWrapper.class)
public class DruidDataSourceAutoConfiguration {
    private final DruidConfiguration configuration;
    
    public DruidDataSourceAutoConfiguration(DruidConfiguration configuration) {
        this.configuration = configuration;
    }
    
    @Bean
    public DataSource dataSource() {
        return new DruidDataSourceWrapper(configuration);
    }
}
  1. 创建一个自定义的DruidDataSourceStarter类,用@Import注解导入DruidDataSourceAutoConfiguration类,实现将自定义的配置类注册到Spring Boot应用程序中。
@Configuration
@Import(DruidDataSourceAutoConfiguration.class)
public class DruidDataSourceStarter {
}
  1. 在resources/META-INF/spring.factories文件中配置自定义starter。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.druidstarter.DruidDataSourceStarter

这样就实现了自定义的Druid数据源starter。可以按照自己的配置,引入该starter并使用自定义的Druid数据源。如果应用程序中已经使用了其他starter(如spring-boot-starter-jdbc或mybatis-spring-boot-starter)使用HikariCP作为数据源,自定义的Druid数据源将会在存在HikariCP的情况下不创建数据源。

【以下回答由 GPT 生成】

对于以上需求,可以按照以下步骤来实现自定义Druid数据源starter:

  1. 创建一个新的Maven项目,并将其命名为druid-data-source-starter。

  2. 在该项目的pom.xml文件中添加必要的依赖,包括spring-boot-starter、spring-boot-autoconfigure、druid和其他你需要使用的库。示例pom.xml文件如下:

<dependencies>
    <!-- Spring Boot dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>

    <!-- Druid dependency -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>

    <!-- Other dependencies -->
    <!-- Add other dependencies you need here -->
</dependencies>
  1. 创建一个自动配置类(AutoConfiguration class),用于配置Druid数据源。该类应该实现org.springframework.boot.autoconfigure.AutoConfiguration接口,并使用@Configuration@ConditionalOnClass注解。示例代码如下:
@Configuration
@ConditionalOnClass(DataSource.class)
public class DruidDataSourceAutoConfiguration implements AutoConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "druid")
    public DataSource dataSource() {
        return new DruidDataSource();
    }
}
  1. 创建一个META-INF/spring.factories文件,在其中添加你的自动配置类的引用。该文件告诉Spring Boot加载你的自动配置类。示例内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.DruidDataSourceAutoConfiguration
  1. application.properties文件中添加Druid数据源的配置,使用独立前缀"druid"。示例内容如下:
druid.url=jdbc:mysql://localhost:3306/mydb
druid.username=root
druid.password=secret
  1. 对于第4点中提到的需求,即如果应用程序已经配置了spring-boot-starter-jdbc或mybatis-spring-boot-starter等starter,默认使用HikariCP作为数据源,我们可以使用@ConditionalOnMissingBean注解来实现。修改自动配置类的代码如下:
@Configuration
@ConditionalOnClass(DataSource.class)
public class DruidDataSourceAutoConfiguration implements AutoConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "druid")
    @ConditionalOnMissingBean(DataSource.class)
    public DataSource dataSource() {
        return new DruidDataSource();
    }
}

这样,如果应用程序已经配置了其他的数据源,比如HikariCP,那么Druid数据源就不会被创建。

至此,我们已经按照需求实现了自定义Druid数据源的starter。你可以将该项目构建成jar包,然后在其他Spring Boot应用程序中引入该starter,并使用Druid数据源进行数据源配置。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^