自定义Spring Boot Starter

目录

  1. 简介
  2. 实施步骤
  • 创建项目 spring-boot-jdbc-starter
  • 添加启动器相关依赖
  • 创建属性配置类
  • 创建自动配置类
  • 编写自动配置文件 (spring.factories)
  • 使用自定义的启动器
  1. 代码实现
  • 引入依赖
  • 创建属性配置类
  • 创建自动配置类
  • 编写自动配置属性文件
  1. 使用自定义启动器
  • 确定使用的项目和启动器所安装的包
  • 在项目的 POM 文件中引入自定义启动器
  • 在项目中验证 spring-boot-jdbc-starter
  1. 总结

简介:定义一个连接池启动器,当用户引入了连接池启动依赖之后,项目中就已经自动配置了连接池,通过样例学习如何自定一个Starter。

实施步骤

  1. 创件启动器项目
  2. 添加启动器相关依赖
  3. 创建属性配置类
  4. 创建自动配置类
  5. 编写自动配置文件(srping.factories)
  6. 使用自定义的启动器

首先先创建一个空的Maven项目

代码实现

创建项目spring-boot-jdbc-starter

引入依赖

        <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.7.8</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>com.mchange</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>

创建属性配置类

package com.practice.autoconfig;


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//@Service使用相似,用来做语义的表示
//@Getter和@Setter注解,以便自动生成属性的getter和setter方法。不再需要手动编写这些方法。
//@Component //自动创建DataSourceProperties这个bean然后提供给其他文件@Autowired注入使用
//@EnableConfigurationProperties(value = {DataSourceProperties.class})//代表是会先创建Value等于的class文件 但是用了EnableConfigurationProperties注解,那么被引入的class的@Component注解就不能用了。因为
//因为调用方方会使用@EnableConfigurationProperties这个注解
@ToString
@Getter
@Setter
//需要配置spring-boot-configuration-processor依赖,用于生成metadata,否则会警告。
//@ConfigurationProperties
@ConfigurationProperties(prefix = "spring.jdbc.datasource")//属性由使用启动器的人提供
public class DataSourceProperties {
//采用@ConfigurationProperties注解批量注入属性值,设置属性的前缀即可,属性名称要一致
    private String driveClassName;
    private String url;
    private String username;
    private String password;
}

创建自动配置类

package com.practice.autoconfig;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;
//javax.sql.DataSource 是 Java 标准库中的一个接口,它定义了一组方法,用于获取数据库连接。javax.sql.DataSource 接口通常用于在Java应用程序中管理数据库连接池,以提高数据库连接的性能和可用性。
/**
 * 配置类:用于创建数据源对象
 */

@SpringBootConfiguration //声明配置类,等价于@Configuration
@EnableConfigurationProperties(value = {DataSourceProperties.class})//代表是会先创建Value等于的class文件 但是用了EnableConfigurationProperties注解,那么被引入的class的@Component注解就不能用了。因为
public class DataSourceAutoConfiguration {

    @Autowired
    DataSourceProperties dataSourceProperties;
    /**
     * 声明Bean对象,相当于之前在spring-dao.xml配置文件中声明的数据源对象。
     * 创建Druid数据源Bean
     * @return Druid数据源
     */
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        // 设置数据库驱动类全限定名
        dataSource.setDriverClassName(dataSourceProperties.getDriveClassName());
        // 设置数据库URL
        dataSource.setUrl(dataSourceProperties.getUrl());
        // 设置数据库用户名
        dataSource.setUsername(dataSourceProperties.getUsername());
        // 设置数据库密码
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }

}

编写自动配置属性文件

在resources文件下面新建META-INF/spring.factories

#Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.practice.autoconfig.DataSourceAutoConfiguration

做完之后注意执行install,安装项目idea->Maven->LIfecycle->install

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-boot-jdbc-starter 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ spring-boot-jdbc-starter ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 0 resource
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ spring-boot-jdbc-starter ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /Users/wujiahao/JAVA/springbootjdbcstarter/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ spring-boot-jdbc-starter ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory /Users/wujiahao/JAVA/springbootjdbcstarter/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ spring-boot-jdbc-starter ---
[INFO] Changes detected - recompiling the module!
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ spring-boot-jdbc-starter ---
[INFO] 
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ spring-boot-jdbc-starter ---
[INFO] Building jar: /Users/wujiahao/JAVA/springbootjdbcstarter/target/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ spring-boot-jdbc-starter ---
[INFO] Installing /Users/wujiahao/JAVA/springbootjdbcstarter/target/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar to /Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar
[INFO] Installing /Users/wujiahao/JAVA/springbootjdbcstarter/pom.xml to /Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/spring-boot-jdbc-starter-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.874 s
[INFO] Finished at: 2023-09-14T21:19:23+08:00
[INFO] Final Memory: 29M/319M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

这里我们可以找到安装到的Maven仓库中已经安装好的starter

/Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/

找到spring-bospring-boot-jdbc-starter-1.0-SNAPSHOT.pom文件

找到

    <groupId>com.practice</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

使用自定义启动器

  • 确定使用的项目和启动器所安装的包是同一个Maven仓库

  • 在项目的POM文件中引入

    <groupId>com.practice</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 在项目中验证spring-boot-jdbc-starter

  • 在 IntelliJ IDEA 中通过 Maven 创建 Spring Boot 项目的步骤如下:

    1. 打开 IntelliJ IDEA: 启动 IntelliJ IDEA 并确保已经安装 Maven 插件。

    2. 创建新项目: 选择 "File" > "New" > "Project..." 或者直接点击 "Create New Project"。

    3. 选择 Maven: 在 "New Project" 窗口中选择 "Maven" 作为项目类型。

    4. 选择 Spring Initializr: 在 "New Project" 窗口中选择 "Spring Initializr" 作为项目模板。

    5. 配置项目: 在接下来的窗口中,填写项目的 Group、Artifact、Name、Description 等信息,然后点击 "Next"。

    6. 选择 Spring Boot 版本和依赖: 在 "Next" 窗口中,选择 Spring Boot 的版本,然后选择你需要的依赖。你可以选择 Web、JPA、Security 等常用依赖,也可以在后续进行添加。

    7. 指定项目存放位置: 在 "Next" 窗口中,指定项目的存放位置,然后点击 "Finish"。

    8. 等待项目创建: IntelliJ IDEA 将会下载依赖、创建项目结构等,稍等片刻直到项目创建完成。

    9. 项目创建完成: 项目创建完成后,你可以在 IntelliJ IDEA 中进行代码编写、运行等操作了。

    10. 再resources下创建application.yml,这是我们在自定义Starter中依赖的配置参数

      spring:
        jdbc:
          datasource:
            driverClassName: com.mysql.jdbc.Driver
            url: jdbc:mysql://localhost:3306/springboot_01
            username: dev
            password: dev
      
    11. 编写一个简单的Controller

    package com.XXXXXXX.controller;
    
    
    import com.practice.bean.DataSourceProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.sql.DataSource;
    
    @RestController
    public class HelloController {
        @Autowired
        DataSource DataSource;
    
        @RequestMapping("/hello")
        public String sayHello(){
            System.out.println("DATA starter"+DataSource.getClass());
            return "hello spring boot!";
        }
    }
    
    

运行应用程序,访问http://localhost:8080/hello应该能看到"Hello, World!"的输出。

这样,你就成功创建并运行了一个简单的Spring Boot应用程序,使用了自定义的Spring Boot Starter来简化配置和依赖管理。

总结

通过自定义 Spring Boot Starter,我们成功地封装了常用功能和配置,为项目开发带来了巨大便利。这种优雅而强大的技术手段,让我们能够专注于业务逻辑的实现,而不必过多关注底层技术细节和繁琐的配置。

自定义 Starter 不仅简化了项目的配置和初始化过程,更提高了代码的复用性和可维护性。通过标准化配置和降低学习成本,我们能够更高效地开展团队协作,加速项目的开发周期,为业务的快速迭代提供了有力支持。

在日益复杂和快速变化的开发环境中,我们应积极探索并应用这样的创新技术,不断优化项目的架构,以适应未来的发展需求。自定义 Spring Boot Starter 是我们实现这一目标的重要一步,它不仅让我们的项目更具竞争力,也使我们的开发体验更加愉悦。

让我们共同享受这种技术带来的便利,共同推动软件开发领域的进步!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容