SpringBoot 之自定义启动器
什么是启动器?
-
一个启动器就相当于一个子项目,我们平时创建的项目,大多数都是可以独立运行的,但是也有些项目不能独立运行,这些项目我们通常会将其打包安装在本地仓库中,供其他项目引入使用,而启动器就是这样的一个项目。
-
一个启动器就相当于一个项目,每一个项目都是一个依赖,而每个项目内部都引入了其自身需要的依赖(jar),比如说 spring-boot-starter-web 启动器内部就依赖了 web 所需要的 jar 包
-
而启动器之所以能够自动装配一些类,是因为我们使用了一些特定的注解,诸如:@EnableAutoConfigration 自动配置注解,该注解会自动读取 META-INF/spring.factories 配置中的自动配置类;还有一些条件化配置注解 @ConditionalOnXxxx 注解来实现条件配置
下面就以 jdbc 数据库连接池启动器为例说明自定义启动器的步骤:
需求:当我们引入 spring-boot-jdbc-starter 自定义启动器的时候,就会根据配置文件帮我们自动装配数据库连接池.
-
创建启动器项目
-
添加启动器相关依赖
-
创建属性配置类
-
创建自动配置类
-
编写自动配置文件(spring.factories)
-
使用自定义的启动器
1.首先,我们需要创建一个 Maven 项目,并添加自身需要的依赖,比如说数据库连接池的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--引入spring‐boot‐starter;所有starter的基本配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--自动配置连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2.创建属性配置类
package com.atguigu.autoconfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Component
@ConfigurationProperties(prefix = "spring.jdbc.datasource")
public class DataSourceProperties {
private String driverClassName ;
private String url;
private String username;
private String password;
// 生成set get toString方法
}
3.创建自动配置类
package com.atguigu.autoconfig;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguratioin {
@Autowired
private DataSourceProperties dataSourceProperties ;
@Bean
@ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid")
public DataSource createDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
dataSource.setUrl(dataSourceProperties.getUrl());
dataSource.setUsername(dataSourceProperties.getUsername());
dataSource.setPassword(dataSourceProperties.getPassword());
return dataSource;
}
@Bean
@ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "c3p0")
public DataSource createC3P0DataSource() throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(dataSourceProperties.getDriverClassName());
dataSource.setJdbcUrl(dataSourceProperties.getUrl());
dataSource.setUser(dataSourceProperties.getUsername());
dataSource.setPassword(dataSourceProperties.getPassword());
return dataSource;
}
}
4.编写自动配置属性文件
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.atguigu.autoconfig.DataSourceAutoConfiguration
5.使用 install 安装到本地仓库,在其他项目中引入依赖并添加相关配置即可;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异